我希望能够检测图像中的logo并将其删除。我的一个想法是查找具有大量像素的对象,然后进行删除。另一个想法是遍历所有白色像素(我已经反转了我的图像),然后查找形成大区域的像素,并将其删除。是否有比这更好的算法?此外,OpenCV中哪些方法可以帮助我检测具有大量像素数量的对象。
我希望能够检测图像中的logo并将其删除。我的一个想法是查找具有大量像素的对象,然后进行删除。另一个想法是遍历所有白色像素(我已经反转了我的图像),然后查找形成大区域的像素,并将其删除。是否有比这更好的算法?此外,OpenCV中哪些方法可以帮助我检测具有大量像素数量的对象。
import cv2
import numpy as np
img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()
mask = np.zeros(gray.shape,np.uint8)
现在在阈值图像中查找轮廓。筛选面积在500到5000之间的轮廓。它很可能是一个大的白色斑点,显然不是字母。(请记住,这个面积值是特定于这张图片的。我不知道你的其他图片情况,你需要自己找到它)。现在将该轮廓绘制在填充为白色的掩膜图像上。
contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if 200<cv2.contourArea(cnt)<5000:
cv2.drawContours(img,[cnt],0,(0,255,0),2)
cv2.drawContours(mask,[cnt],0,255,-1)
以下是检测到的轮廓图像:
接下来是掩模图像:
现在你可以使用cv2.bitwise_not
函数对图像进行反转。 在这个函数中,你可以选择给定一个掩模,在其中我们将提供我们的掩模图像,以便函数仅在输入图像中存在白色掩模区域时操作。
cv2.bitwise_not(gray2,gray2,mask)
最后展示图片:
cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()
以下是结果:
注意:
上述方法的目的是保留白色正方形中的“橙色”。这就是为什么会出现一些伪影的原因。如果你不想要那个橙色,可以更加精确。
只需找到面积过滤轮廓的边界矩形,并绘制填充有黑色的矩形即可。
代码:
import cv2
import numpy as np
img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()
contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if 200<cv2.contourArea(cnt)<5000:
(x,y,w,h) = cv2.boundingRect(cnt)
cv2.rectangle(gray2,(x,y),(x+w,y+h),0,-1)
cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
检测到的边界矩形:
然后用黑色填充这些矩形:
这比之前更好,当然如果你不想要橙色就好了。