Python 用于OCR的干净图像

Python 用于OCR的干净图像,python,opencv,image-processing,ocr,image-segmentation,Python,Opencv,Image Processing,Ocr,Image Segmentation,我一直在尝试为OCR清理此图像,但结果好坏参半: 我取得的最好成绩: 有没有关于我遗漏了什么的线索?您可以在Python/OpenCV中执行“除法规范化”以删除背景。但这对大纲字体问题没有帮助 输入: 结果: 您可以在Python/OpenCV中执行“除法规范化”以删除背景。但这对大纲字体问题没有帮助 输入: 结果: 我的MATLAB代码来解决它。我知道你是用Python写的,所以你必须翻译 %Read in im = imread('DuQy7.png'); %Convert to

我一直在尝试为OCR清理此图像,但结果好坏参半:

我取得的最好成绩:

有没有关于我遗漏了什么的线索?

您可以在Python/OpenCV中执行“除法规范化”以删除背景。但这对大纲字体问题没有帮助

输入:


结果:

您可以在Python/OpenCV中执行“除法规范化”以删除背景。但这对大纲字体问题没有帮助

输入:


结果:
我的MATLAB代码来解决它。我知道你是用Python写的,所以你必须翻译

%Read in
im = imread('DuQy7.png');
%Convert to grayscale
img = rgb2gray(im);
img = rescale(img);
%Binarize with threshold of 0.7/1.0
imbw = imbinarize(img,0.7/1);
%Flip blacks/whites
imbw = imcomplement(imbw);
%Label, L is labelled image, n is # of labels
[L,n] = bwlabeln(imbw);

count = zeros(n,1);
[y,x] = size(L);

%Get count for each label
L = uint8(L);
for j=1:y
    for i=1:x
        if L(j,i) ~= 0
            count(L(j,i)) = count(L(j,i)) + 1;
        end
    end
end

%Find label with most values in image
max = 0;
maxi = 1;
for index=1:n
    if max < count(index)
        max = count(index);
        maxi = index;
    end
end

%Replace large region and color other labels to white
for j=1:y
    for i=1:x
        if L(j,i) == maxi
            L(j,i) = 0;
        elseif L(j,i) ~= 0
            L(j,i) = 256;
        end
    end
end

%view and save
imshow(L)
imwrite(L,'outputTXT.bmp');
%已读入
im=imread('DuQy7.png');
%转换为灰度
img=rgb2灰色(im);
img=重新缩放(img);
%使用阈值0.7/1.0进行二值化
imbw=imbinarize(img,0.7/1);
%翻转黑白
imbw=imcomplete(imbw);
%标签,L是标签图像,n是标签的#
[L,n]=bwlabeln(imbw);
计数=零(n,1);
[y,x]=尺寸(L);
%获取每个标签的计数
L=uint8(L);
对于j=1:y
对于i=1:x
如果L(j,i)~=0
计数(L(j,i))=计数(L(j,i))+1;
终止
终止
终止
%查找图像中具有最多值的标签
max=0;
maxi=1;
对于索引=1:n
如果最大值<计数(索引)
最大值=计数(索引);
maxi=指数;
终止
终止
%替换大区域并将其他标签涂成白色
对于j=1:y
对于i=1:x
如果L(j,i)=maxi
L(j,i)=0;
elseif L(j,i)~=0
L(j,i)=256;
终止
终止
终止
%查看并保存
imshow(L)
imwrite(L,'outputText.bmp');

您可能可以更好地调整阈值,以便更好地剪切包含的背景区域。您还可以查找非常小的标记区域并将其删除,因为它们可能被错误地包括在内


背景的某些部分将无法去除,因为它们与实际符号无法区分。例如,在符号x2、y1和x2、y2之间,在轮廓白色之间有一个黑色背景区域,其值与符号相同。因此很难解析出来。

我的MATLAB代码解决了这个问题。我知道你是用Python写的,所以你必须翻译

%Read in
im = imread('DuQy7.png');
%Convert to grayscale
img = rgb2gray(im);
img = rescale(img);
%Binarize with threshold of 0.7/1.0
imbw = imbinarize(img,0.7/1);
%Flip blacks/whites
imbw = imcomplement(imbw);
%Label, L is labelled image, n is # of labels
[L,n] = bwlabeln(imbw);

count = zeros(n,1);
[y,x] = size(L);

%Get count for each label
L = uint8(L);
for j=1:y
    for i=1:x
        if L(j,i) ~= 0
            count(L(j,i)) = count(L(j,i)) + 1;
        end
    end
end

%Find label with most values in image
max = 0;
maxi = 1;
for index=1:n
    if max < count(index)
        max = count(index);
        maxi = index;
    end
end

%Replace large region and color other labels to white
for j=1:y
    for i=1:x
        if L(j,i) == maxi
            L(j,i) = 0;
        elseif L(j,i) ~= 0
            L(j,i) = 256;
        end
    end
end

%view and save
imshow(L)
imwrite(L,'outputTXT.bmp');
%已读入
im=imread('DuQy7.png');
%转换为灰度
img=rgb2灰色(im);
img=重新缩放(img);
%使用阈值0.7/1.0进行二值化
imbw=imbinarize(img,0.7/1);
%翻转黑白
imbw=imcomplete(imbw);
%标签,L是标签图像,n是标签的#
[L,n]=bwlabeln(imbw);
计数=零(n,1);
[y,x]=尺寸(L);
%获取每个标签的计数
L=uint8(L);
对于j=1:y
对于i=1:x
如果L(j,i)~=0
计数(L(j,i))=计数(L(j,i))+1;
终止
终止
终止
%查找图像中具有最多值的标签
max=0;
maxi=1;
对于索引=1:n
如果最大值<计数(索引)
最大值=计数(索引);
maxi=指数;
终止
终止
%替换大区域并将其他标签涂成白色
对于j=1:y
对于i=1:x
如果L(j,i)=maxi
L(j,i)=0;
elseif L(j,i)~=0
L(j,i)=256;
终止
终止
终止
%查看并保存
imshow(L)
imwrite(L,'outputText.bmp');

您可能可以更好地调整阈值,以便更好地剪切包含的背景区域。您还可以查找非常小的标记区域并将其删除,因为它们可能被错误地包括在内


背景的某些部分将无法去除,因为它们与实际符号无法区分。例如,在符号x2、y1和x2、y2之间,在轮廓白色之间有一个黑色背景区域,其值与符号相同。因此很难解析出来。

您可以用很低的阈值对图像进行二值化。然后在黑色区域上执行区域标签。移除最大的标记区域。剩下的面具应该是所有的角色。@Karson谢谢,我试过了,得出了相同的结论。我将如何标记黑色区域?找到轮廓并不困难,但如何检查它们的颜色呢?您可以实现自己的区域生长算法,也可以使用一个库。对Python示例的快速搜索显示了我认为可以实现的方法。您需要确保在尝试标记之前对图像进行二值化。您可以使用非常低的阈值对图像进行二值化。然后在黑色区域上执行区域标签。移除最大的标记区域。剩下的面具应该是所有的角色。@Karson谢谢,我试过了,得出了相同的结论。我将如何标记黑色区域?找到轮廓并不困难,但如何检查它们的颜色呢?您可以实现自己的区域生长算法,也可以使用一个库。对Python示例的快速搜索显示了我认为可以实现的方法。您需要确保在尝试添加标签之前对图像进行二值化。添加标签的步骤,它会删除什么?@L14n设置标签的步骤是为了删除背景渐变。添加标签的步骤,它会删除什么?@L14n设置标签的步骤是为了删除背景渐变。
%Read in
im = imread('DuQy7.png');
%Convert to grayscale
img = rgb2gray(im);
img = rescale(img);
%Binarize with threshold of 0.7/1.0
imbw = imbinarize(img,0.7/1);
%Flip blacks/whites
imbw = imcomplement(imbw);
%Label, L is labelled image, n is # of labels
[L,n] = bwlabeln(imbw);

count = zeros(n,1);
[y,x] = size(L);

%Get count for each label
L = uint8(L);
for j=1:y
    for i=1:x
        if L(j,i) ~= 0
            count(L(j,i)) = count(L(j,i)) + 1;
        end
    end
end

%Find label with most values in image
max = 0;
maxi = 1;
for index=1:n
    if max < count(index)
        max = count(index);
        maxi = index;
    end
end

%Replace large region and color other labels to white
for j=1:y
    for i=1:x
        if L(j,i) == maxi
            L(j,i) = 0;
        elseif L(j,i) ~= 0
            L(j,i) = 256;
        end
    end
end

%view and save
imshow(L)
imwrite(L,'outputTXT.bmp');