提取序列matlab中的字符
extract characters in sequence matlab
我想提取序列中的字符。例如,给定这张图片:
这是我写的代码:
[L Ne]=bwlabel(BinaryImage);
stats=regionprops(L,'BoundingBox');
cc=vertcat(stats(:).BoundingBox);
aa=cc(:,3);
bb=cc(:,4);
hold on
figure
for n=1:size(stats,1)
if (aa(n)/bb(n) >= 0.2 && aa(n)/bb(n)<= 1.25)
[r,c] = find(L==n);
n1=BinaryImage(min(r):max(r),min(c):max(c));
imshow(~n1);
pause(0.5)
end
hold off
end
我应该做哪些更改才能使顺序正确?
regionprops
通过按 column-major 顺序查找 blob 进行操作。 regionprops
不按行优先顺序运行,这正是您要寻找的。列优先顺序源自 MATLAB 本身,因为以列优先顺序操作是本机行为。此外,您使用 find / bwlabel
的逻辑也以列优先格式运行,因此在尝试以行优先格式显示字符时,您必须牢记这两点。
因此,一种简单的方法是修改您的 for
循环,这样您就可以按行而不是按列访问结构。对于您的示例图像,描述的字符顺序如下:
1 3 5
2 4 6
您需要按以下顺序访问该结构:[1 3 5 2 4 6]
。因此,您可以更改 for
循环来访问这个新数组,您可以像这样创建这个新数组:
ind = [1:2:numel(stats) 2:2:numel(stats)];
完成后,只需修改 for
循环以访问 ind
中的值。为了使您的代码完全可重现,我将直接从 Whosebug 读取您的图像,并 反转 图像,因为文本是黑色的。文本需要为白色才能使 blob 分析成功:
%// Added
clear all; close all;
BinaryImage = ~im2bw(imread('http://s4.postimg.org/lmz6uukct/plate.jpg'));
[L Ne]=bwlabel(BinaryImage);
stats=regionprops(L,'BoundingBox');
cc=vertcat(stats(:).BoundingBox);
aa=cc(:,3);
bb=cc(:,4);
figure;
ind = [1:2:numel(stats) 2:2:numel(stats)]; %// Change
for n = ind %// Change
if (aa(n)/bb(n) >= 0.2 && aa(n)/bb(n)<= 1.25)
[r,c] = find(L==n);
n1=BinaryImage(min(r):max(r),min(c):max(c));
imshow(~n1);
pause(0.5)
end
end
警告
以上代码假设只有两行字符。如果你有更多,那么很明显指定的索引将不起作用。
如果您希望它适用于多行,那么我要编写的逻辑假设文本是水平的而不是倾斜的。简而言之,您将循环直到 运行 超出结构,并且在循环开始时,您将搜索具有最小 (x,y)
坐标的 blob 左上角坐标的 blob我们没有处理。找到它后,您将搜索在此源 y
坐标的某个阈值内的所有 y
坐标,然后获取这些位置的索引。您将重复此操作,直到 运行 超出结构。
像这样:
thresh = 5; %// Declare tolerance
cc=vertcat(stats(:).BoundingBox);
topleft = cc(:,1:2);
ind = []; %// Initialize list of indices
processed = false(numel(stats),1); %// Figure out those blobs that have been processed
while any(~processed) %// While there is at least one blob to look at...
%// Determine the blob that has the smallest y/row coordinate that's
%// unprocessed
cc_proc = topleft(~processed,:);
ys = min(cc_proc(:,2));
%// Find all blobs along the same row that are +/-thresh rows from
%// the source row
loc = find(abs(topleft(:,2)-ys) <= thresh & ~processed);
%// Add to list and mark them off
ind = [ind; loc];
processed(loc) = true;
end
ind = ind.'; %// Ensure it's a row
然后您将使用 ind
变量并像以前一样将其与 for
循环一起使用。
我想提取序列中的字符。例如,给定这张图片:
这是我写的代码:
[L Ne]=bwlabel(BinaryImage);
stats=regionprops(L,'BoundingBox');
cc=vertcat(stats(:).BoundingBox);
aa=cc(:,3);
bb=cc(:,4);
hold on
figure
for n=1:size(stats,1)
if (aa(n)/bb(n) >= 0.2 && aa(n)/bb(n)<= 1.25)
[r,c] = find(L==n);
n1=BinaryImage(min(r):max(r),min(c):max(c));
imshow(~n1);
pause(0.5)
end
hold off
end
我应该做哪些更改才能使顺序正确?
regionprops
通过按 column-major 顺序查找 blob 进行操作。 regionprops
不按行优先顺序运行,这正是您要寻找的。列优先顺序源自 MATLAB 本身,因为以列优先顺序操作是本机行为。此外,您使用 find / bwlabel
的逻辑也以列优先格式运行,因此在尝试以行优先格式显示字符时,您必须牢记这两点。
因此,一种简单的方法是修改您的 for
循环,这样您就可以按行而不是按列访问结构。对于您的示例图像,描述的字符顺序如下:
1 3 5
2 4 6
您需要按以下顺序访问该结构:[1 3 5 2 4 6]
。因此,您可以更改 for
循环来访问这个新数组,您可以像这样创建这个新数组:
ind = [1:2:numel(stats) 2:2:numel(stats)];
完成后,只需修改 for
循环以访问 ind
中的值。为了使您的代码完全可重现,我将直接从 Whosebug 读取您的图像,并 反转 图像,因为文本是黑色的。文本需要为白色才能使 blob 分析成功:
%// Added
clear all; close all;
BinaryImage = ~im2bw(imread('http://s4.postimg.org/lmz6uukct/plate.jpg'));
[L Ne]=bwlabel(BinaryImage);
stats=regionprops(L,'BoundingBox');
cc=vertcat(stats(:).BoundingBox);
aa=cc(:,3);
bb=cc(:,4);
figure;
ind = [1:2:numel(stats) 2:2:numel(stats)]; %// Change
for n = ind %// Change
if (aa(n)/bb(n) >= 0.2 && aa(n)/bb(n)<= 1.25)
[r,c] = find(L==n);
n1=BinaryImage(min(r):max(r),min(c):max(c));
imshow(~n1);
pause(0.5)
end
end
警告
以上代码假设只有两行字符。如果你有更多,那么很明显指定的索引将不起作用。
如果您希望它适用于多行,那么我要编写的逻辑假设文本是水平的而不是倾斜的。简而言之,您将循环直到 运行 超出结构,并且在循环开始时,您将搜索具有最小 (x,y)
坐标的 blob 左上角坐标的 blob我们没有处理。找到它后,您将搜索在此源 y
坐标的某个阈值内的所有 y
坐标,然后获取这些位置的索引。您将重复此操作,直到 运行 超出结构。
像这样:
thresh = 5; %// Declare tolerance
cc=vertcat(stats(:).BoundingBox);
topleft = cc(:,1:2);
ind = []; %// Initialize list of indices
processed = false(numel(stats),1); %// Figure out those blobs that have been processed
while any(~processed) %// While there is at least one blob to look at...
%// Determine the blob that has the smallest y/row coordinate that's
%// unprocessed
cc_proc = topleft(~processed,:);
ys = min(cc_proc(:,2));
%// Find all blobs along the same row that are +/-thresh rows from
%// the source row
loc = find(abs(topleft(:,2)-ys) <= thresh & ~processed);
%// Add to list and mark them off
ind = [ind; loc];
processed(loc) = true;
end
ind = ind.'; %// Ensure it's a row
然后您将使用 ind
变量并像以前一样将其与 for
循环一起使用。