Python 对图像进行预处理以提取文本并去除噪声

Python 对图像进行预处理以提取文本并去除噪声,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,[![在此处输入图像描述][1][1]我有一张非常嘈杂的图像,必须对其执行OCR。附加的片段是更大图像的一部分。我将如何以最佳方式对该图像进行预处理 我已经尝试过使用大津二值化对图像进行预处理,使用各种过滤器和腐蚀膨胀对图像进行平滑处理。我还使用了connectedComponentWithStats来消除图像中的噪声。但这些都无助于处理污迹文本 编辑-此文本需要预处理才能执行OCR img = cv2.imread(file,0) gaus = cv2.GaussianBlur(img,(5,

[![在此处输入图像描述][1][1]我有一张非常嘈杂的图像,必须对其执行OCR。附加的片段是更大图像的一部分。我将如何以最佳方式对该图像进行预处理

我已经尝试过使用大津二值化对图像进行预处理,使用各种过滤器和腐蚀膨胀对图像进行平滑处理。我还使用了connectedComponentWithStats来消除图像中的噪声。但这些都无助于处理污迹文本

编辑-此文本需要预处理才能执行OCR

img = cv2.imread(file,0)
gaus = cv2.GaussianBlur(img,(5,5),0)

_, blackAndWhite = cv2.threshold(gaus, 127, 255, cv2.THRESH_BINARY_INV)

nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, None, None, None, 8, cv2.CV_32S)
sizes = stats[1:, -1] 
img2 = np.zeros((labels.shape), np.uint8)

for i in range(0, nlabels - 1):
    if sizes[i] >= 50:  
        img2[labels == i + 1] = 255

res = cv2.bitwise_not(img2)

(thresh, img_bin) = cv2.threshold(img, 128, 255,cv2.THRESH_BINARY|     cv2.THRESH_OTSU)

img_bin = 255-img_bin 

kernel_length = np.array(img).shape[1]//80

verticle_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, kernel_length))

hori_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_length, 1))

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

img_temp1 = cv2.erode(img_bin, verticle_kernel, iterations=3)
verticle_lines_img = cv2.dilate(img_temp1, verticle_kernel, iterations=3)

img_temp2 = cv2.erode(img_bin, hori_kernel, iterations=3)
horizontal_lines_img = cv2.dilate(img_temp2, hori_kernel, iterations=3)

alpha = 0.5
beta = 1.0 - alpha

img_final_bin = cv2.addWeighted(verticle_lines_img, alpha, horizontal_lines_img, beta, 0.0)

img_final_bin = cv2.erode(~img_final_bin, kernel, iterations=2)
(thresh, img_final_bin) = cv2.threshold(img_final_bin, 128,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

这里有一种消除噪音的方法

  • 将图像转换为灰度和大津阈值
  • 执行形态学变换以平滑图像
  • 查找轮廓并使用轮廓区域进行过滤
  • 反转图像

在转换为灰度后,我们使用大津阈值来获得二值图像

[![在此处输入图像描述][1][1]

从这里,我们创建一个内核并执行形态学打开以平滑图像。您可以尝试在这里使用不同的内核大小来消除更多的噪声,但增加内核大小也会删除文本细节

[![在此处输入图像描述][2][2]

接下来,我们找到轮廓并使用具有最大阈值区域的轮廓区域进行过滤,以去除小颗粒。对轮廓进行填充,有效去除噪声

[![在此处输入图像描述][3][3]

最后我们反转图像以得到结果

[![在此处输入图像描述][4][4]

import cv2
import numpy as np

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)

cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    area = cv2.contourArea(c)
    if area < 150:
        cv2.drawContours(opening, [c], -1, (0,0,0), -1)

result = 255 - opening 
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('result', result)
cv2.waitKey()
导入cv2
将numpy作为np导入
image=cv2.imread('1.jpg')
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh\u二进制\u INV+cv2.thresh\u OTSU)[1]
kernel=cv2.getStructuringElement(cv2.morp_ELLIPSE,(3,3))
opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,迭代次数=1)
cnts=cv2.查找孔(开口、cv2.外部翻新、cv2.链近似简单)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于150:
cv2.等高线图(开口[c],-1,(0,0,0),-1)
结果=255-打开
cv2.imshow('thresh',thresh)
cv2.imshow(“开始”,开始)
cv2.imshow(“结果”,结果)
cv2.waitKey()

,但这仍然不会使文本处于令人满意的提取状态。文本仍然污迹斑斑,字符识别困难。在这种情况下,很难增强文本。预处理文本的典型方法是使用锐化过滤器或直方图均衡化来增强对比度。但是在你的例子中,文本被弄脏了,所以最好的方法是使用形态学运算。另一种可能的方法是尝试对图像进行骨架化。您可以使用库和函数Post original image来执行此操作