gpt4 book ai didi

opencv - 从象形文字图像中提取凹陷部分

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:55 27 4
gpt4 key购买 nike

目前我正在尝试从像这样的图像中提取象形文字符号。 enter image description here

我所做的是使用 hough 变换来查找线条并将图像分成几部分以使我更容易。但是我尝试了一组算法来从图像中提取凹陷的字母,但我遇到了死胡同..

我尝试过的是形态学操作、边缘检测和轮廓查找的混合。那么是否有任何算法设计来做这样的事情或任何提示将不胜感激。

最佳答案

您可以对输入图像进行上采样,应用一些平滑,找到 Otsu 阈值,然后 use this threshold to find Canny edges具有不同的窗口大小。

对于较大的窗口 (5 x 5),您会得到包含几乎所有所需边缘的噪声图像,外加噪声。 noisy

对于较小的窗口 (3 x 3),您会得到噪点较少的图像,但缺少一些边缘。 less noisy

如果这个噪声较小的图像不够好,您可以尝试使用噪声图像作为掩码从形态学上重建它。在这里,我使用形态学 hit-miss 变换将噪声图像中的一些对角线边缘段链接起来,然后应用重建。 recon

使用一个

Mat k = (Mat_<int>(3, 3) <<
0, 0, 1,
0, -1, 0,
1, 0, 0);

用于连接断边的内核,你会得到一个更细的轮廓。

thinner outline

请注意,在下面的 c++ 代码中,我使用了朴素的重构。

Mat im = imread("rsSUY.png", 0);
/* up sample and smooth */
pyrUp(im, im);
GaussianBlur(im, im, Size(5, 5), 5);
/* find the Otsu threshold */
Mat bw1, bw2;
double th = threshold(im, bw1, 0, 255, THRESH_BINARY | THRESH_OTSU);
/* use the found Otsu threshold for Canny */
Canny(im, bw1, th, th/2, 5, true); /* this result would be noisy */
Canny(im, bw2, th, th/2, 3, true); /* this result would be less noisy */

/* link broken edges in more noisy image using hit-miss transform */
Mat k = (Mat_<int>(3, 3) <<
0, 0, 1,
0, -1, 0,
0, 0, 0);
Mat hitmiss;
morphologyEx(bw1, hitmiss, MORPH_HITMISS, k);
bw1 |= hitmiss;

/* apply morphological reconstruction to less noisy image using the modified noisy image */
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
double prevMu = 0;
Mat recons = bw2.clone();
for (int i = 0; i < 200; i++)
{
dilate(recons, recons, kernel);
recons &= bw1;
Scalar mu = mean(recons);
if (abs(mu.val[0] - prevMu) < 0.001)
{
break;
}
prevMu = mu.val[0];
}

imshow("less noisy", bw2);
imshow("reconstructed", recons);

waitKey();

关于opencv - 从象形文字图像中提取凹陷部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317534/

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