如何从图像中去除水平线和垂直线?

16次(最近30天)
mutasam hazzah
mutasam hazzah 2021年8月20日
评论道: mutasam hazzah2021年8月21日
你好,我女士在手写数字OCR,为此我需要段数的每一位(4 - 7位数),然后将这些数字神经分类数,每件事是好的但分割将框线之间的联系(包含数量)和数字图像。
那么,有没有可能去掉这些线呢?

接受的答案

图像分析
图像分析 2021年8月21日
试着从这个开始。继续开发项目,将其推广到其他图像中。
% Demo by Image Analyst
clc;%清除命令窗口。
关闭所有%关闭所有数据(imtool.除外)
清晰;删除所有已存在的变量。或者clearvars,如果你想的话。
工作空间;%确保显示工作区面板。
格式长g
格式紧凑的
字形大小= 20;
%--------------------------------------------------------------------------------------------------------
%读取映像
grayImage = imread (“numbers.jpeg”);
%--------------------------------------------------------------------------------------------------------
%显示图像。
次要情节(2 2 1);
imshow (grayImage []);
轴(“上”“图像”);
标题(原始图像的“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
hFig = gcf;
hFig。WindowState =“最大化”%可能无法在MATLAB的早期版本中工作。
drawnow;
%获取图像的尺寸。
对于灰度图像,% numberOfColorChannels = 1,对于RGB彩色图像,% numberOfColorChannels = 3。
[rows, columns, numberOfColorChannels] = size(grayImage)
如果numberOfColorChannels > 1
这并不是我们所期望的那种真正的灰度,而是彩色的。
%提取红色通道(因此品红色线将是白色)。
grayImage = grayImage(:,:, 2);
结束
裁掉白色边框。
mask = bwareafilt(grayImage < 255, 1);
道具= regionprops(面具,的边界框(“大小));
次要情节(2,2,2);
grayImage = imcrop(grayImage, props.BoundingBox);
imshow (grayImage);
轴(“上”“图像”);
标题(灰度图像的“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
drawnow;
次要情节(2、2、3);
imhist (grayImage);
网格
包含(“灰度”“字形大小”、字形大小);
ylabel (“像素”“字形大小”、字形大小);
交互式阈值图像。
lowThreshold = 0;
highThreshold = 51;
%裁判://www.tianjin-qmedu.com/matlabcentral/fileexchange/29372-thresholding-an-image?s_tid=srchtitle
% [lowThreshold, highThreshold] = threshold(lowThreshold, highThreshold, grayImage)
%的阈值。
mask = grayImage < highThreshold;
找出区域。
道具= regionprops(面具,“区域”);
allAreas =([道具。区域),“下”
次要情节(2、2、4);
%只保留大于500像素和小于2000像素的区域。”
Mask = bwareafilt(Mask, [500,20000]);
imshow(面具);
%给每个blob标上8连通性,这样我们就可以测量它了
[labeledImage, numberOfBlobs] = bwlabel(mask, 8);
给区域应用各种伪颜色。
coloredLabelsImage = label2rgb (labelimagage,“hsv”“k”“洗牌”);
%显示伪彩色图像。
imshow (coloredLabelsImage);
标题= sprintf (“最后的面具”);
标题(标题,“字形大小”、字形大小);

更多的答案(3)

为副总经理
为副总经理 2021年8月21日
编辑:为副总经理 2021年8月21日
我把我自己的也送进去。它使用hough()和houghpeaks()来校正图像,使矩形滤波器与框的边缘对齐。剩下的只是常规的过滤。我们感兴趣的参数是二值化灵敏度、过滤器宽度和bwareaopen()调用中指定的区域。
一个更健壮的解决方案可以在有限的角度范围内更好地使用hough(),以更好地识别框的边缘,而较少依赖过滤将框从文本中分离出来。这只是一个想法,并不是一个明确的建议。
inpict = imread (“ocrbox.jpg”);
inpict = rgb2gray(庄稼边界(inpict,[南南南南]));%作物边界是来自MIMT在FEX
inpict = ~ imbinarize (inpict“自适应”“foregroundpolarity”“黑暗”“敏感”, 0.15);
找出主直线的角度,校正
[H T R] =踝关节(inpict);
P = houghpeaks (H, 1,“阈值”装天花板(0.3 *马克斯(H (:))));
th0 = 90 - t (P(1、2));
inpict = imrotate(双(inpict), -th0,双线性的“作物”);
w = 100;
Linemask = medfilt2(inpict,[1 w]) + medfilt2(inpict,[1 w]);
linemask = bwareaopen (linemask,500 > 0.5);
linemask = imdilate (linemask strel (“磁盘”5));
Inpict = bwareaopen(Inpict & ~linemask,200);
imshow (inpict)
正如注释所述,cropborder()来自文件交换上的MIMT。这是必要的,因为提供的图像是一个保存的图像,带有不必要的填充。因为你有原始图像,你不需要裁剪任何东西。
不要通过保存图形来保存图像。保存实际的图像,而不是相当于图像的截图。

图像分析
图像分析 2021年8月20日
看到
你也可以尝试一个形态开口来擦掉线条,尽管它可能也会影响你的数字。
或者你可以尝试hough()或houghlines(),看看是否能找到这些线,只沿着这些线擦除。
一种算法在这张特定的图像上可能行得通,但在其他图像上可能行不通。
祝你好运。
1评论
mutasam hazzah
mutasam hazzah 2021年8月21日
谢谢您的回复。
实际上,我尝试了OCR im matlab和hough()也但我不能得到结果,由于线和数字之间的连接。

登录评论。


darova
darova 2021年8月21日
这是一个尝试。使用 bwlabel 然后分开每个区域进行分析
I0 = imread (“image.jpeg”);
I1 = im2bw(钱数,0.2);
I2 = imdilate (I1, (2));% imopen (I1, (3));
imshow (I2)

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!