2012-01-26 3 views
3

Как найти расположение красной области на первом изображении и пометить одно и то же местоположение в полутонах с использованием Matlab?Как найти расположение красной области в изображении с помощью MATLAB?

Colored Image

Marked Image

+0

Ну, я получаю результат градиента как изображение graylevel, а не цветное изображение, как показано на первом изображении. Я думаю, что это просто цветовое представление уровня освещенности изображения. В этом случае вам необходимо выровнять изображение для подходящего значения, чтобы изолировать области с высокой освещенностью.Я отредактировал свой ответ для этого. –

+0

@Kim Просто любопытно: как было создано первое изображение? –

ответ

28

Надежда это продолжение 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 для обработки изображений. Но я уверен, что это простая задача, и вы можете закончить код).

EDIT:

После того, как я реализовал формулу дифференцирования и применять фильтрации нижних частот, изображение я получил в оттенках серого. Я просто применил порог, чтобы получить только области с высокой освещенностью (включая область штрих-кода) и затемнить все остальные части. Теперь примените некоторую эрозию, чтобы удалить простые шумы или небольшое ложное обнаружение. Применять дилатацию для компенсации. Теперь найдите контур с максимальной площадью (что, скорее всего, штрих-код). Возьмите для него наименьший возможный ограничивающий прямоугольник. Это ваш штрих-код. (Я только что реализовал его в OpenCV Python. Я не знаю, как это сделать в Matlab). Ниже некоторые результаты испытаний:

Image 1 Image 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 documentation here.

+0

как я могу продолжить эту кодировку? Последняя часть моего кодирования - это ... figure(), ColourBar = imagesc (C); цветная полоса; – Kim

+0

Является ли вывод этого кода таким же, как и первое изображение в вашем вопросе? Я имею в виду высокий красный цвет в месте штрих-кода? –

+0

yup !! кодирование происходит отсюда [ссылка] (http://stackoverflow.com/questions/9005746/applying-the-formula-to-determine-the-barcode-matlab) – Kim

Смежные вопросы