如何在第一张图像中找到红色区域的位置,并使用matlab在灰度图像中标记相同的位置?
答案 0 :(得分:30)
希望这是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.