【问题标题】:How to find the location of red region in an image using MATLAB?如何使用 MATLAB 查找图像中红色区域的位置?
【发布时间】:2012-02-19 06:51:33
【问题描述】:

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

【问题讨论】:

  • 好吧,我得到的渐变结果是灰度图像,而不是第一张图像中显示的彩色图像。我认为这只是图像照明水平的颜色表示。在这种情况下,您需要将图像阈值设置为合适的值,以隔离高照度区域。我已经为此编辑了答案。
  • @Kim 很好奇:第一张图片是如何生成的?

标签: matlab image-processing opencv computer-vision


【解决方案1】:

希望这是this question.的延续

我想建议你先阅读一些关于图像处理的好书和基础书籍。我推荐这本书:Digital image processing using MATLAB by Gonzalez

关于你的问题:

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 中实现)。下面是一些测试结果:

以下是 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 documentation here.

【讨论】:

  • 我怎样才能继续编码??我编码的最后一部分是这个...... figure(),ColourBar = imagesc(C);颜色条;
  • 此代码的输出是否与您问题中的第一张图片相同?我的意思是,条形码位置的红色偏高?
  • 是的!编码来自这里link
  • 我知道。我看过那个问题。如果是这样,我上面所说的程序很容易实现。如上所述,首先将生成的图像拆分为 R 平面。应用阈值。我也在上面给出了命令。你不能试试吗?首先,我再次建议您阅读我提到的书。没有基础知识,就无法前进。
  • 我确实尝试了编码,但它不起作用...尝试访问 ColourBar(:,2);索引超出范围,因为 numel(ColourBar)=1。是不是我的变量有误??
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2015-07-31
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多