필터 지우기
필터 지우기

Problems with segments in an image

조회 수: 2 (최근 30일)
Harold
Harold 2013년 4월 21일
I'm working on a project that involves character recognition. If I load an image that has for example the letters A, B, C, D, my program finds the regions and does some operations on it to get rid of vertical and horizontal white lines and also re-sizes the image to a pre-defined size. This works fine. However, if I load an image up that has one letter for example A, the bwlabel segments the image into 4 regions because that's the minimum number of regions it can have. I need to be able to code some logic that will help with this.
Here is the procedure that I have developed thus far (it has problems). num is the number of regions in the image from bwlabel. Ibw is the logical matrix for the image. Iprops is a structured array of properties for each region. Each row is a region.
grid_size = [10, 10];
[r c] = size(Iprops);
if num == 4 && num == r %single character recognition
segments = imresize(Ibw, grid_size, 'bicubic');
segments = segments(:)';
end
The problem with this code lies in the use of num == r. An image of one letter will return the same number of properties as an image of 4 letters. I need to modify my logic to account for this.
Edit: Now that I think of it, if I can determine if any regions overlap I could include that in my logic statement. The questions arise though, how can I check if any regions overlap?
  댓글 수: 3
Harold
Harold 2013년 4월 22일
편집: Harold 2013년 4월 22일
I tried the region overlap idea but realized that will not work out because the matrices of each region are a different size.
Harold
Harold 2013년 4월 22일
I've re-uploaded both to a different hosting site.

댓글을 달려면 로그인하십시오.

채택된 답변

Image Analyst
Image Analyst 2013년 4월 22일
There is no reason why the A would be split up into 4 regions. I'd have to see your code. Do you do something like
blackLetters = grayImage < 128;
[labeledImage, numberOfBlobs] = bwlabel(blackLetters)
???
  댓글 수: 1
Harold
Harold 2013년 4월 22일
편집: Harold 2013년 4월 22일
Not exactly. Here is what I have. Image file is http://i37.tinypic.com/29err4w.jpg
clc
clear all
filename = 'A.bmp';
I = imread(filename);
imshow(I)
%convert image from rgb to gray scale
Igray = rgb2gray(I);
%convert grayscale image to binary image
Ibw = im2bw(Igray,graythresh(Igray));
%Find edges in grayscale image
Iedge = edge(uint8(Ibw));
%Image Dilation (thickens the edges)
se = strel('square',2);
Iedge = imdilate(Iedge, se);
%Image Filling - gets rid of any background pixels inside the segments
Ifill= imfill(Iedge,'holes');
[Ilabel num] = bwlabel(Ifill);
Iprops = regionprops(Ilabel);
Ibox = [Iprops.BoundingBox];
Ibox = reshape(Ibox,[4 num]);
%Draw bounding box around segmentations
for cnt = 1:num
rectangle('position',Ibox(:,cnt),'edgecolor','r');
point = Iprops(cnt,1).Centroid;
text(point(1),point(2),num2str(cnt),'HorizontalAlignment','center','BackgroundColor',[.7 .9 .7]);
end
Edit: I think I just found out what I was doing wrong. Instead of bwlabel(Ifill), it should be bwlabel(Ibw).

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by