Mam obraz RGB z różnymi znakami. Moim głównym celem jest policzenie znaków, które mają kontakt z granicami obrazu.
Podejście i problem
Zacząłem od załadowania obrazu [rys. 1], a następnie przekonwertował go na skalę szarości i zastosował filtr środkowy, aby pozbyć się szumów [ryc. 2]. Następnie binaryzowałem go z progiem 0,2, co dało wynik na rycinie 3. W tym momencie dostałem mój binaryzowany obraz, ale problem polega na tym, że niektóre części, które należą do tego samego znaku, pojawiają się w różnych regionach, zamiast tylko jednego. Teraz moim celem jest scalenie regionów należących do tego samego obiektu, dzięki czemu mógłbym bwlabel
policzyć, ile znaków jest na obrazie, i użyć, imclearborder
aby pozbyć się znaków na granicy, i użyć bwlabel
ponownie, aby uzyskać różnicę między dwójka.
Moje podejście było użyć bwmorph
, Dilate
aby rozszerzać obiekty, a następnie starają się wypełnić je imfill
, holes
. Problem polega jednak na tym, że jeśli je rozrzedzę w niewielkiej ilości [ryc. 4], imfill
wydaje się , że ich nie wypełnia, jeśli rozszerzę je o dużą ilość [Ryc. 5] wszystkie obiekty zaczną się łączyć :(
Kod
img=im2double(imread('image.png')); figure, imshow(img)
img_gray=rgb2gray(img); imshow(img_gray);
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)
Ryciny
Ryc. 1 :
Ryc. 1 http://dl.dropbox.com/u/5272012/1.png
Ryc. 2 :
rys. 2 http://dl.dropbox.com/u/5272012/2.png
Ryc. 3 :
rys. 3 http://dl.dropbox.com/u/5272012/3.png
Ryc. 4 :
rys. 4 http://dl.dropbox.com/u/5272012/4.png
Ryc. 5 :