Как найти местоположение красной области на изображении, используя MATLAB? - PullRequest
4 голосов
/ 26 января 2012

Как найти местоположение красной области на первом изображении и отметить это же место на изображении в оттенках серого, используя matlab?

Colored Image

Marked Image

1 Ответ

30 голосов
/ 26 января 2012

Надеюсь, что это продолжение этого вопроса.

Я хотел бы предложить вам сначала прочитать несколько хороших и фундаментальных книг по обработке изображений.Я рекомендую эту книгу: Цифровая обработка изображений с использованием 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).Ниже приведены некоторые результаты теста:

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 здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...