gpt4 book ai didi

c++ - OpenCV 二进制自适应阈值 OCR

转载 作者:搜寻专家 更新时间:2023-10-30 23:57:48 25 4
gpt4 key购买 nike

我需要将一些图像转换为二进制文件以进行 OCR。

以下是我正在使用的函数:

Mat binarize(Mat & Img, Mat& res, float blocksize, bool inverse)
{
Img.convertTo(Img,CV_32FC1,1.0/255.0);
CalcBlockMeanVariance(Img,res, blocksize, inverse);
res=1.0-res;
res=Img+res;
if (inverse) {
cv::threshold(res,res,0.85,1,cv::THRESH_BINARY_INV);
} else {
cv::threshold(res,res,0.85,1,cv::THRESH_BINARY);
}
cv::resize(res,res,cv::Size(res.cols/2,res.rows/2));

return res;
}

其中 CalcBlockMeanVariance:

void CalcBlockMeanVariance(Mat& Img,Mat& Res,float blockSide, bool inverse) //21 blockSide - the parameter (set greater for larger font on image)
{
Mat I;
Img.convertTo(I,CV_32FC1);
Res=Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
Mat inpaintmask;
Mat patch;
Mat smallImg;
Scalar m,s;

for(int i=0;i<Img.rows-blockSide;i+=blockSide)
{
for (int j=0;j<Img.cols-blockSide;j+=blockSide)
{
patch=I(Range(i,i+blockSide+1),Range(j,j+blockSide+1));
cv::meanStdDev(patch,m,s);
if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
{
Res.at<float>(i/blockSide,j/blockSide)=m[0];
}else
{
Res.at<float>(i/blockSide,j/blockSide)=0;
}
}
}

cv::resize(I,smallImg,Res.size());

if (inverse) {
cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY_INV);
} else {
cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY);
}


Mat inpainted;
smallImg.convertTo(smallImg,CV_8UC1,255);

inpaintmask.convertTo(inpaintmask,CV_8UC1);
inpaint(smallImg, inpaintmask, inpainted, 5, INPAINT_TELEA);

cv::resize(inpainted,Res,Img.size());
Res.convertTo(Res,CV_32FC1,1.0/255.0);

}

当将 1 作为 blockSide 传递给 CalcBlockMeanVariance 时,我得到了这个结果,我试图提高 blockSide 但它只会导致更糟糕的结果。

之前:

enter image description here

之后:

enter image description here

任何人都可以建议将此图像转换为二进制文件作为 OCR 准备的不同方法吗?

谢谢。

最佳答案

我认为您可以使用 Otsu 进行阈值处理方法。您可以将它应用于整个图像或图像 block 。我做了以下步骤:

  • 使用 Otsu 方法对所需输入进行阈值处理。
  • 关闭结果。

Python 代码

image = cv2.imread('image4.png', cv2.IMREAD_GRAYSCALE) # reading image
if image is None:
print 'Can not find the image!'
exit(-1)
# thresholding image using ostu method
ret, thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
# applying closing operation using ellipse kernel
N = 3
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (N, N))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# showing the result
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

在第一部分中,我使用 imread 读取输入图像并检查图像是否正确打开!

image = cv2.imread('image4.png', cv2.IMREAD_GRAYSCALE) # reading image
if image is None:
print 'Can not find the image!'
exit(-1)

现在通过将 THRESH_BINARY_INV 提供给 thresh 方法,使用 otsu 方法对图像进行阈值处理 | THRESH_OTSU 作为它的参数。 otsu 方法基于寻找最佳阈值的优化问题。因此,我通过给阈值下限 0 和上限 255 来提供阈值的可能值范围。

ret, thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

然后使用Ellipse 内核进行关闭操作以去除图像中的黑洞。

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (N, N))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

结果

Figure 1

关于c++ - OpenCV 二进制自适应阈值 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23260345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com