【问题标题】:How to split 2 connected objects with slight connection如何拆分 2 个具有轻微连接的连接对象
【发布时间】:2015-04-11 02:03:37
【问题描述】:

我正在从事 OCR 项目,我面临一个问题,即要识别的文本图像可能包含连接的两个字符,因此当我尝试获取每个字符时,它将这两个字符作为一个图像。 这是代码

BW1 = imread('test.png');
BW1 = BW1(:,:,1);
BW1=im2bw(BW1,0.9);
imshow(BW1)
patterns = bwlabel(~BW1);
patternStats = regionprops(patterns,'all');
patternNumber = size(patternStats);
imagePatternArray = cell(patternNumber);

%make cell array of pattern Matrices
for i = 1:1:patternNumber
  imageMatrix = patternStats(i).Image;
  imageMatrix = imresize(imageMatrix, [25 25]);
  imagePatternArray{i}=imageMatrix;
end  

原始图像

转换为 BW 后

【问题讨论】:

  • 可以上传包含所有文字的原图吗?我有一些想法,但除非我可以访问原始图像,否则我无法确定它们是否会起作用。
  • @rayryeng 当然,我编辑了这个问题,谢谢
  • 没问题。给我一点。我要尝试一些东西。

标签: matlab image-processing ocr connected-components


【解决方案1】:

我建议您直接查看图像本身的颜色分布。具体来说,如果您查看原始图像,您会发现与图像的其余部分相比,有一个占主导地位的紫色。我建议您通过rgb2hsv 将您的彩色图像转换为 HSV 颜色空间,然后在色调组件本身上设置阈值。因此,请执行以下操作:

%// Read directly from StackOverflow
im = imread('http://i.stack.imgur.com/vu92r.png');

%// Convert image into HSV
hsv = rgb2hsv(im2double(im));

%// Threshold hue component by 0.75
out = im2bw(hsv(:,:,1), 0.75);

%// Show the image
imshow(out);

如果您查看 HSV 颜色空间中的色调分量,紫色位于 0.6 和 0.8 之间。为了安全起见,我选择了 0.75。

我们得到:

输出非常小,所以让我使用双线性插值将图像大小调整为 4 倍:

由于上采样,您会看到一些混叠,但请忽略它。我想告诉你每个字母肯定是分开的。您可以单独处理这些字母。

【讨论】:

  • 这看起来只适合紫色字符,我的项目应该适用于所有文本颜色。
  • 找出具有非零色调的任何颜色的平均色调并将其用作阈值。另一个想法是找到最小值和最大值,然后上升 75%……或者类似的东西。无论哪种方式,如果您的图像是彩色的,一定要利用色调。
  • 我为 im2bw 尝试了另一个阈值,它适用于该图像,但对于其他图像它不起作用
  • 显然你需要让它自适应。查找 graythresh 命令
  • 请上传更多图片以便我测试
猜你喜欢
  • 2012-06-09
  • 2010-09-16
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 2016-10-05
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多