如何使用MATLAB查找图像中红色区域的位置?
computer-vision
image-processing
matlab
opencv
5
0

如何使用Matlab在第一张图像中找到红色区域的位置并在灰度图像中标记相同的位置?

彩色图像

标记图像

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

希望这是这个问题的延续

我想建议您先阅读一些有关图像处理的基础书籍。我推荐这本书: Gonzalez使用MATLAB进行数字图像处理

无论如何,关于您的问题:

1)将图像转换为R,G,B平面。

Image_red = Image_rgb(:,1);
Image_green = Image_rgb(:,2);
Image_blue = Image_rgb(:,3);

2)由于所需区域的红色含量很高(根据问题中的图像),因此请取R平面和阈值作为合适的值。

BW = im2bw(Image_red, threshold value)

3)您获得二进制图像,其中条形码区域是一种颜色(假设是白色),而其他部分是另一种颜色(黑色)。

4)现在,将这个白色区域的位置作为最小边界矩形。

STATS = regionprops(BW, 'BoundingBox')

将此位置定为矩形后,请执行任何操作。例如,要隔离条形码以进行条形码识别,请使用imcrop命令从原始图像中裁剪出此矩形:

barcode = imcrop(original_image, rect)

(我知道代码还不完整。我只给出了使用命令的提示。因为,我对matlab不熟悉,并且我使用opencv进行图像处理。但是我敢肯定,这是一件容易的事,您可以完成代码)。

编辑:

在我实现了推导公式并应用了低通滤波之后,得到的图像就是灰度图像。我只是应用了一个阈值,所以我只获得高照度区域(包括条形码区域),而遮蔽所有其他部分。现在,施加一些腐蚀以消除简单的噪声或小的误检测。应用膨胀补偿。现在找到具有最大面积的轮廓(很可能是条形码)。获得最小可能的边界矩形。这是您的条形码。 (我只是在OpenCV Python中实现了它。我不知道如何在Matlab中实现它)。以下是一些测试结果:

图片1图片2

以下是OpenCV代码:

#### Code for BARCODE detection  ######
import cv,sys
imgco = cv.LoadImage('image.jpg')
img = cv.CreateImage(cv.GetSize(imgco),8,1)
imgx = cv.CreateImage(cv.GetSize(img),cv.IPL_DEPTH_16S,1)
imgy = cv.CreateImage(cv.GetSize(img),cv.IPL_DEPTH_16S,1)
thresh = cv.CreateImage(cv.GetSize(img),8,1)

### Convert image to grayscale ###
cv.CvtColor(imgco,img,cv.CV_BGR2GRAY)

### Finding horizontal and vertical gradient ###

cv.Sobel(img,imgx,1,0,3)
cv.Abs(imgx,imgx)

cv.Sobel(img,imgy,0,1,3)
cv.Abs(imgy,imgy)

cv.Sub(imgx,imgy,imgx)
cv.ConvertScale(imgx,img)

### Low pass filtering ###
cv.Smooth(img,img,cv.CV_GAUSSIAN,7,7,0)

### Applying Threshold ###
cv.Threshold(img,thresh,100,255,cv.CV_THRESH_BINARY)

cv.Erode(thresh,thresh,None,2)
cv.Dilate(thresh,thresh,None,5)

### Contour finding with max. area ###
storage = cv.CreateMemStorage(0)
contour = cv.FindContours(thresh, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
area = 0
while contour:
    max_area = cv.ContourArea(contour)
    if max_area>area:
        area = max_area
        bar = list(contour) 
    contour=contour.h_next()

### Draw bounding rectangles ###
bound_rect = cv.BoundingRect(bar)
pt1 = (bound_rect[0], bound_rect[1])
pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
cv.Rectangle(imgco, pt1, pt2, cv.CV_RGB(0,255,255), 2)

cv.ShowImage('img',imgco)    
cv.WaitKey(0)   

试试这个代码。如果您了解该代码,请尝试转换为matlab。您可以在此处查看OpenCV文档。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号