4

我将 OpenCV 用于我的图像处理算法,并试图修复字符中参差不齐的边缘。我读到形态Hit-Miss 变换是一个非常好的解决方案。是否有任何开源实现?

或者是否有任何其他算法可用于修复参差不齐的边缘?

一些需要修复的样本字母

4

2 回答 2

2

可以在这里找到一个简单的 hit-and-miss 实现:

#include <opencv2/imgproc/imgproc.hpp>

// Hit-or-miss transform function
void hitmiss(cv::Mat& src,    // Source image, 8 bit single-channel matrix
             cv::Mat& dst,    // Destination image 
             cv::Mat& kernel) // Kernel. 1=foreground, -1=background, 0=don't care
{
    CV_Assert(src.type() == CV_8U && src.channels() == 1);

    cv::Mat k1 = (kernel == 1) / 255;
    cv::Mat k2 = (kernel == -1) / 255;

    cv::normalize(src, src, 0, 1, cv::NORM_MINMAX);

    cv::Mat e1, e2;
    cv::erode(src, e1, k1);
    cv::erode(1 - src, e2, k2);

    dst = e1 & e2;
}

但我认为您只能通过膨胀来解决问题,如本幻灯片第 7 页中的示例(取自 Gonzales 等人的“数字图像处理”一书。)

于 2013-01-22T14:47:10.657 回答
0

使用Marvin组合形态膨胀和腐蚀产生以下结果:

在此处输入图像描述

源代码:

package characterRestoration;

import marvin.image.MarvinColorModelConverter;
import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.plugin.MarvinImagePlugin;
import marvin.util.MarvinPluginLoader;

public class CharacterRestoration {

MarvinImage                 image = MarvinImageIO.loadImage("./res/character_in.png");
private MarvinImagePlugin   dilation = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.dilation");
private MarvinImagePlugin   erosion = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.morphological.erosion");

private boolean[][]         matrixD = new boolean[][]{
                            {false,false,false,false,false,false,false,false,false},
                            {false,false,false,false,false,false,false,false,false},
                            {false,false,false,false,false,false,false,false,false},
                            {false,false,true,true,true,true,true,true,true},
                            {false,false,true,true,true,true,true,true,true},
                            {false,false,true,true,true,true,true,true,true},
                            {false,false,false,false,false,false,false,false,false},
                            {false,false,false,false,false,false,false,false,false},
                            };

private boolean[][]         matrixE = new boolean[][]{
                            {true,true,true},
                            {true,true,true},
                            {true,true,true}
                            };          

public CharacterRestoration(){
    // Convert image to binary format
    image = MarvinColorModelConverter.rgbToBinary(image, 125);

    // Morphological Dilation
    dilation.setAttribute("matrix", matrixD);
    dilation.process(image.clone(), image);

    // Morphological Erosion
    erosion.setAttribute("matrix", matrixE);
    erosion.process(image.clone(), image);

    MarvinImageIO.saveImage(image, "./res/character_out.png");
}

public static void main(String[] args) {
    new CharacterRestoration();
}

}

于 2013-07-14T14:14:46.047 回答