Jak znaleźć lokalizację czerwonego regionu na obrazie za pomocą MATLAB?

Jak znaleźć lokalizację czerwonego obszaru na pierwszym obrazie i zaznaczyć tę samą lokalizację w obrazie w skali szarości za pomocą matlab?

Kolorowy Obrazek

Zaznaczony Obrazek

Author: Abid Rahman K, 2012-01-26

1 answers

Mam nadzieję, że jest to kontynuacja tego pytania.

Chciałbym zaproponować, aby najpierw przeczytać kilka dobrych i podstawowych książek na temat przetwarzania obrazów. Polecam tę książkę: cyfrowe przetwarzanie obrazu za pomocą MATLAB by Gonzalez .

W każdym razie odnośnie Twojego pytania:

1) Konwertuj obraz na płaszczyznę R,G,B.

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

2) ponieważ wymagany region ma wysoką zawartość czerwieni(jak na obrazku w twoim pytaniu), weź płaszczyznę R i próg dla odpowiedniego wartość.

BW = im2bw(Image_red, threshold value)

3) otrzymujesz obraz binarny, gdzie obszar kodu kreskowego jest jednym kolorem (Załóżmy, że biały), a druga część jest innym kolorem (Czarny).

4) Teraz uzyskaj lokalizację tego białego obszaru jako minimalny prostokąt obwiedni.

STATS = regionprops(BW, 'BoundingBox')

Kiedy już zdobędziesz to położenie prostokąta, rób co chcesz. Na przykład, aby wyizolować Kod kreskowy do rozpoznawania kodu kreskowego, Przytnij ten prostokąt z oryginalnego obrazu za pomocą polecenia imcrop:

barcode = imcrop(original_image, rect)

(wiem, że kod nie jest kompletny. I dał tylko wskazówki poleceń do użycia. Ponieważ nie jestem zaznajomiony z matlabem i używam opencv do przetwarzania obrazu. Ale jestem pewien, że jest to łatwe zadanie i można ukończyć kod).

EDIT:

Po zaimplementowaniu formuły derywacyjnej i zastosowaniu filtrowania dolnoprzepustowego, otrzymałem obraz w skali szarości. Właśnie zastosowałem próg, aby uzyskać tylko regiony o wysokim oświetleniu (w tym region kodów kreskowych) i zaciemnić wszystkie inne części. Teraz zastosuj erozję, aby usunąć proste szumy lub małe fałszywe wykrywanie. Zastosuj dylatację dla odszkodowania. Teraz znajdź kontur z maksymalnym obszarem (który jest najprawdopodobniej kodem kreskowym). Uzyskaj dla niego najmniejszy możliwy prostokąt obwiedniowy. To Twój kod kreskowy. (Właśnie zaimplementowałem go w Pythonie OpenCV. Nie wiem jak to zrobić w Matlabie). Poniżej kilka wyników testów:

Zdjęcie 1Zdjęcie 2

Poniżej znajduje się kod 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)   

Spróbuj tego kodu. Jeśli rozumiesz kod, spróbuj przekonwertować na matlab. Możesz zobaczyć OpenCV dokumentacja tutaj.

 30
Author: Abid Rahman K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:16