gpt4 book ai didi

opencv - 如何使用opencv从图像中删除图章

转载 作者:行者123 更新时间:2023-12-02 16:50:21 25 4
gpt4 key购买 nike

我正在做一个 OCR 项目,在预处理中,需要删除一些 RED 标记,以便可以检测到标记附近的文本。我尝试了很多方法(比如更改像素值、红色 channel 中的阈值)但都失败了。
任何建议都受到高度赞赏。
enter image description here

最佳答案

Python、C++、Java 还是什么?由于您没有说明您正在使用的 OpenCV 实现,所以我用 C++ 给出我的答案。
一个选项是使用 HSV颜色空间过滤掉定义密封的红色值范围。我的方法是使用 CMYK颜色空间过滤除黑色(或深色)文本之外的所有内容。它应该在打印媒体上做得很好,这就是你的情况。

    //read input image:
std::string imageName = "C://opencvImages//seal.png";
cv::Mat imageInput = cv::imread( imageName );
现在,执行 CMYK转换。 OpenCV 不支持这种开箱即用的操作,请耐心等待,因为我在本文末尾提供了帮助函数。
    //CMYK conversion:
std::vector<cv::Mat> cmyk;
cmyk = rgb2cmyk( imageInput );

//This is the Black channel:
cv::Mat blackChannel = cmyk[3].clone();
这是黑色 channel 的图像;很高兴所有不是黑色(或黑色)的东西实际上都消失了!

现在,可以选择应用 增强结果亮度和对比度调整 .尝试将文本与背景分离得更好一点;我们想要一些定义的像素分布来获得漂亮的二值图像。
    //Brightness and contrast adjustment:
float alpha = 2.0;
float beta = -50.0;
contrastBrightnessAdjustment( blackChannel, alpha, beta );
同样,OpenCV 不提供开箱即用的亮度和对比度调整。但是,它的实现非常容易。稍等一下,让我给你看一下这个操作的结果:

好的。让我们 Otsu-threshold这个坏男孩得到一个包含干净文本的漂亮二进制图像:
    cv::threshold( blackChannel, binaryImage ,0, 255, cv::THRESH_OTSU );
这就是你得到的:

现在, RGBCMYK转换功能。我正在使用以下实现。该函数接收 RGB图像并返回一个包含每个 CMYK 的向量 channel
std::vector<cv::Mat> rgb2cmyk( cv::Mat& inputImage ){

std::vector<cv::Mat> cmyk;

for (int i = 0; i < 4; i++) {
cmyk.push_back( cv::Mat( inputImage.size(), CV_8UC1 ) );
}

std::vector<cv::Mat> inputRGB;
cv::split( inputImage, inputRGB );

for (int i = 0; i < inputImage.rows; i++)
{
for (int j = 0; j < inputImage.cols; j++)
{

float r = (int)inputRGB[2].at<uchar>(i, j) / 255.;
float g = (int)inputRGB[1].at<uchar>(i, j) / 255.;
float b = (int)inputRGB[0].at<uchar>(i, j) / 255.;
float k = std::min(std::min(1-r, 1-g), 1-b);

cmyk[0].at<uchar>(i, j) = (1 - r - k) / (1 - k) * 255.;
cmyk[1].at<uchar>(i, j) = (1 - g - k) / (1 - k) * 255.;
cmyk[2].at<uchar>(i, j) = (1 - b - k) / (1 - k) * 255.;
cmyk[3].at<uchar>(i, j) = k * 255.;

}
}

return cmyk;
}
contrastBrightnessAdjustment函数就是这个,使用指针算法实现。该函数接收灰度图像并通过 alpha 应用线性变换。和 beta参数:
void contrastBrightnessAdjustment( cv::Mat inputImage, float alpha, int beta ){

cv::MatIterator_<cv::Vec3b> it, end;
for (it = inputImage.begin<cv::Vec3b>(), end = inputImage.end<cv::Vec3b>(); it != end; ++it) {
uchar &pixel = (*it)[0];
pixel = cv::saturate_cast<uchar>(alpha*pixel+beta);

}

}

关于opencv - 如何使用opencv从图像中删除图章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64519157/

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