我想检测内部图像的徽标,以消除它,我有一个想法是寻找具有大量像素然后删除的对象,另一个想法是循环所有的白色像素(我已倒置我的形象),并寻找形成一个大区域的像素,然后去除这个区域,有没有更好的算法,这个,还有opencv中的哪些方法将帮助我检测大像素数目的对象。如何使用opencv检测大量白色像素的区域?
回答
我有一个方法可以做到这一点。我不知道这种方法是否适用于所有人,但在这里效果很好。
下面是代码(在Python):
首先转换图像为灰度,调整大小图像,应用阈值,并进行相同的尺寸和的该尺寸调整灰度图像的类型的掩模图像。 (遮罩图像只是一个黑色图像)
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)
Below is the detected contour image:
Next is the mask image:
现在你使用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()
结果:
检测边界rects:
然后fillout与黑色矩形的那些:
它比以前的更好,当然如果你不想“ORANGE”)
您可以使用形态滤波器(也许交替顺序滤波),以简化您的多彩色图像,然后使用分割算法像分水岭或粒度的一些方法和选择的最大对象。您可能会在网上找到几个实现。但是,只有徽标是离散的(例如不在背景中),这才能起作用。
你是什么意思(不是背景) – chostDevil 2012-04-21 20:34:10
@PatrickJones意味着我的意思是,如果它是一个形象的地方,而不是一个那些徽标在文本下并且占据整个卡片的名片。或者如果卡被分成几个颜色区域。有很多情况。 – sivann 2012-04-21 20:38:18
什么是形态过滤器或交替顺序过滤请讨论 – chostDevil 2012-04-21 20:47:41
- 1. 使用opencv和Javacv计算轮廓中的白色区域像素
- 2. 检测空白区域的图像
- 3. 在Android中使用openCV检测特定颜色的区域
- 4. 使用OpenCv检测图像中的矩形明亮区域
- 5. OpenCV的:检测黑到白的渐变区域中的
- 6. 如何确定OpenCV中的像素是黑色还是白色?
- 7. 如何使用opencv自动检测并填充封闭区域?
- 8. OpenCV的分组白色像素
- 9. 找到特定区域中的白色/黑色像素javacv
- 10. 如何检测测量水位的白色测量板?
- 11. 漫画气球检测:如何计算矢量内的白色像素<RotatedRect> OpenCV中的椭圆?
- 12. OpenCV的,Java的:颜色检测某一指定区域
- 13. 获取白色像素坐标(OpenCV)
- 14. 遮蔽JPEG图像的白色区域
- 15. OpenCV,Android:来自特定区域或图像部分的颜色检测?
- 16. 使用opencv/Numpy在python中查找彩色图像中的白色像素
- 17. 空白区域的像素宽度
- 18. 如何计算opencv中每个blob中的白色像素?
- 19. 如何从白色区域去除噪声,又不失白色区域
- 20. 如何检测黑白图像中的白色斑点(矩形)?
- 21. 如何按颜色过滤OpenCV图像中的矩形区域?
- 22. 使用opencv检测纯白色圆圈HoughCircles
- 23. 检测图像上的文本并计算使用OpenCv的区域
- 24. 我如何更改使用白蟒的OpenCV只黑色无像素运算
- 25. 使用cvMinMaxLoc识别白色区域()
- 26. 如何使用opencv在matlab中查找彩色图像的感兴趣区域?
- 27. 如何使用openCV中的HoughCircles检测感兴趣区域中的圆圈?
- 28. 使用opencv检测黑色背景上的白色物体的矩形
- 29. 如何检测OpenCV Python中的红色?
- 30. 使用opencv和python进行facedetection只能检测眼睛区域
你为什么调整图像大小? – chostDevil 2012-04-22 10:49:55
这是因为你的图像太大以至于我的屏幕无法将它作为一个整体包含在内。 (这里不是很重要,如果你不喜欢就避免它,'也是小图像意味着更快的操作')顺便说一下,你真正想要的方法是什么?与橙色或没有橙色? – 2012-04-22 10:53:47
如果您知道C++,请更新您的答案,因为我无法在python和C++之间进行映射 – chostDevil 2012-04-22 11:49:33