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

时间:2017-07-26 04:34:09

标签: opencv image-processing

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

我所做的是使用hough变换来查找线条并将图像分成几部分以便于我使用。但我尝试了一套算法来从图像中提取沉没的字母,然后我走到了尽头......

我所尝试的是形态学操作和边缘检测以及轮廓发现的混合。 那么是否有任何算法设计为做这样的事情或任何提示将不胜感激。

3 个答案:

答案 0 :(得分:4)

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

对于较大的窗口(5 x 5),您会得到一个嘈杂的图像,其中包含您需要的几乎所有边缘以及噪点。 noisy

对于较小的窗口(3 x 3),您可以获得噪声较小的图像,但缺少一些边缘。 less noisy

如果这个噪声较小的图像不够好,可以尝试使用噪声图像作为掩模进行形态重建。在这里,我使用形态命中 - 未命中变换链接了噪声图像中的一些对角线边缘段,然后应用重建。 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();

答案 1 :(得分:0)

这项任务的最佳选择是机器学习。你可以:

  1. 为每个字母裁剪或标记几个样本
  2. 使用这些样本训练SSD(单次多盒检测器)
  3. 优势在于您可以一次检测图像中的所有字母。

答案 2 :(得分:0)

我有一个相当简单但不太完美的解决方案。

1。根据图像绿色通道的中位数

找到最佳的上限阈值和下限阈值

上阈值图像:

enter image description here

降低阈值图像:

enter image description here

2。减去两个图像,然后进行中值滤波:

enter image description here

3。 Canny边缘检测:

enter image description here

为了获得更好的效果,你需要通过一些形态学操作来跟进它。