python - OCR的干净图像

标签 python opencv image-processing ocr image-segmentation

我一直在尝试清理此图像的OCR,但得到的结果好坏参半:
enter image description here
我取得的最佳成绩:
enter image description here

def image_smoothening(img):
    ret1, th1 = cv2.threshold(img, 180, 255, cv2.THRESH_BINARY)
    ret2, th2 = cv2.threshold(th1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    blur = cv2.GaussianBlur(th2, (1, 1), 0)
    ret3, th3 = cv2.threshold(
        blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    return th3
    
def remove_noise_and_smooth(img):
    filtered = cv2.adaptiveThreshold(img.astype(
        np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 45, 3)
    kernel = np.ones((1, 1), np.uint8)
    opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel)
    closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
    img = image_smoothening(img)
    or_image = cv2.bitwise_or(img, closing)
    return or_image
关于我所缺少的任何线索吗?

最佳答案

我的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');
output-TXT.png
您可能可以更好地调整阈值,以更好地剪切出包含的背景区域。您还可以查找很小的带标签的区域并删除它们,因为它们可能被错误地包括在内。
背景的某些部分将无法消除,因为它们与实际的符号没有区别。例如,在符号x2,y1和x2,y2之间,轮廓白色之间有一个黑色背景区域,该区域与符号的值相同。因此,将很难解析。

关于python - OCR的干净图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63090540/

相关文章:

c++ - 如何改进 cvMat 中的像素排序?

c++ - Makefile 不适用于 mac os x Mavericks

python - matplotlib 的主循环的阻塞是否可以限制为单个窗口/图形? - 即,Fig.show(blocking=True)

python - Python 中的简单二维聚类算法

python - 在特定索引处的 Pandas 数据框中插入新行

Python - 查找第一个和最后一个白色像素坐标

python - 应用锐化滤镜后重写图像

python - 根据列值重复 pandas DataFrame 中的行

c++ - 使用opencv将像素数据分配到 vector 中

java - vector 卷积 - 计算相邻元素的索引