Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用OpenCV检测大量白色像素区域?_C++_Image Processing_Opencv_Object Detection - Fatal编程技术网

C++ 如何使用OpenCV检测大量白色像素区域?

C++ 如何使用OpenCV检测大量白色像素区域?,c++,image-processing,opencv,object-detection,C++,Image Processing,Opencv,Object Detection,我想检测图像中的徽标,以便将其删除。我有一个想法,那就是寻找具有大量像素的对象,然后删除。另一个想法是循环所有白色像素(我已经反转了我的图像),寻找形成一个大区域的像素,然后移除这个区域。有比这个更好的算法吗。此外,OpenCV中的哪些方法可以帮助我检测大像素数的对象。您可以使用形态过滤器(可能是交替顺序过滤)简化您的多色图像,然后使用分水岭或某些粒度测量方法等分割算法,选择最大的对象。您可以在网上找到几个实现。但是,只有当徽标是离散的(例如,不在背景上)时,这才有效。我有一种方法可以做到这一点

我想检测图像中的徽标,以便将其删除。我有一个想法,那就是寻找具有大量像素的对象,然后删除。另一个想法是循环所有白色像素(我已经反转了我的图像),寻找形成一个大区域的像素,然后移除这个区域。有比这个更好的算法吗。此外,OpenCV中的哪些方法可以帮助我检测大像素数的对象。

您可以使用形态过滤器(可能是交替顺序过滤)简化您的多色图像,然后使用分水岭或某些粒度测量方法等分割算法,选择最大的对象。您可以在网上找到几个实现。但是,只有当徽标是离散的(例如,不在背景上)时,这才有效。

我有一种方法可以做到这一点。我不知道这个方法是否适用于所有人,但在这里效果很好

下面是代码(Python):

首先将图像转换为灰度,调整图像大小,应用阈值,并制作与调整大小的灰度图像大小和类型相同的遮罩图像。(遮罩图像只是一个黑色图像)

现在在阈值图像中查找轮廓。过滤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.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()
导入cv2
将numpy作为np导入
img=cv2.imread('bus.png')
img=cv2.调整大小(img,(400500))
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
ret,灰色=cv2。阈值(灰色,127255,0)
gray2=gray.copy()
等高线,hier=cv2.查找到的等高线(灰色,cv2.翻新列表,cv2.链近似简单)
对于轮廓中的cnt:

如果你说(不是背景)是什么意思@PatrickJones我的意思是如果它是某个地方的一个图像,而不是那些商标位于文本下方并占据整个卡片的名片。或者,如果卡片被分割为多个颜色区域。有很多种情况。请问什么是形态滤波或交替顺序滤波discuss@PatrickJones形态过滤器是连接的过滤器,如膨胀、腐蚀、打开、关闭。ASF使用具有不同(每次较大)结构元素的交替打开和关闭运算符。图像分析是一个大而难的主题,你可以尝试从Mathwork的matlab演示中学到一些东西:我看到你发布了图像。在减少颜色深度之前应进行过滤,以避免产生噪音(如顶部白色正方形内的黑色“头发”)。在那之后,你可以使用这样的东西,为什么你要调整图像的大小?因为你的图像太大了,我的屏幕不能包含它作为一个整体。(这里不太重要。如果您不喜欢,请避免使用。
图像越小,操作速度就越快。
)顺便问一下,您实际需要哪种方法?如果你知道C++,请更新你的答案,因为我不能在Python和C++ C++之间进行映射。但所有功能都是相似的。转到www.opencv.itsez.com,在搜索框中输入python函数。您将获得具有完整文档的C++函数。他们也有教程。顺便说一下,我正在使用opencv 2.4beta。它也与2.3或2.2兼容。
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()