实战OpenCV之图像阈值处理
基础入门
图像阈值处理是一种二值化技术,它基于预设的阈值,可以将图像中的像素分为两大类:一大类是背景,另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较,并根据比较结果决定保留原始值还是替换为新值,新值通常是二值化后的0或255。
OpenCV提供了cv::threshold()函数,以实现基本的阈值处理。
double threshold(InputArray src, OutputArray dst, double thresh,
double maxval, int type);
各个参数的含义如下。
src:输入的单通道图像,通常为灰度图像。
dst:输出图像,与src尺寸相同,类型根据type参数确定。
thresh:阈值。
maxval:当像素值超过阈值时,设置的新值。
type:阈值类型,常见的取值如下。
cv::THRESH_BINARY:大于阈值设为maxval,否则设为0。
cv::THRESH_BINARY_INV:小于阈值设为maxval,否则设为0。
cv::THRESH_TRUNC:大于阈值的像素设为阈值,其余不变。
cv::THRESH_TOZERO:小于阈值的像素设为0,其余不变。
cv::THRESH_TOZERO_INV:大于阈值的像素设为0,其余不变。
实战解析
下面的实战代码完成了一个基本的图像处理任务 —— 将一张灰度图像转换成二值图像。
首先,我们创建一个Mat类型的变量img,并尝试使用imread函数读取图片,通过参数IMREAD_GRAYSCALE指定以灰度模式加载。接下来,我们调用threshold函数对灰度图像img进行阈值处理,将其转换为二值图像。这里,阈值被设置为127,阈值类型为THRESH_BINARY。这意味着,所有像素值大于或等于127的将被设为最大值255(代表白色),其余设为0(代表黑色)。最后,分别使用imshow函数显示原始的灰度图像和经过二值化处理后的图像。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("OpenCV.png", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Can not open or find the image" << endl;
return -1;
}
Mat binaryImg;
threshold(img, binaryImg, 127, 255, THRESH_BINARY);
imshow("Original Image", img);
imshow("Binary Image", binaryImg);
waitKey(0);
return 0;
}
执行上面的代码,运行效果可参考下图。
在实际应用中,阈值的选择往往直接影响到后续处理的效果,特别是对于光照变化大、噪声较多的图像。此时,可以使用下面的自适应阈值处理方法。它能够根据图像局部特性动态调整阈值,特别适合于处理光照不均匀的场景,比如:车牌识别、文档扫描等应用。
自适应阈值处理
自适应阈值处理是一种更智能的图像二值化方法,它不像普通阈值处理那样使用单一固定阈值,而是针对图像的不同区域或区块计算各自的阈值,以适应局部的亮度变化。这对于光照不均匀的图像特别有效,能够更好地保留图像细节。
在OpenCV中,自适应阈值处理使用cv::adaptiveThreshold()函数,其声明如下。
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,
int adaptiveMethod, int thresholdType, int blockSize, double C);
其参数含义与cv::threshold()类似,额外参数的含义如下。
adaptiveMethod:自适应方法,常见取值有cv::ADAPTIVE_THRESH_MEAN_C(均值)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯加权)。
blockSize:用于计算局部阈值的邻域大小,通常选择奇数值,以便有明确的中心像素点。
C:常数项,从计算出的局部阈值中减去或加上这个常数,用于调整最终的阈值。
下面的实战代码演示了使用adaptiveThreshold函数进行自适应阈值处理的情形。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("OpenCV.png", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Can not open or find the image" << endl;
return -1;
}
// 自适应阈值处理
Mat adaptiveThreshImg;
adaptiveThreshold(img, adaptiveThreshImg, 255, ADAPTIVE_THRESH_MEAN_C,
THRESH_BINARY, 11, 2);
imshow("Original Image", img);
imshow("Adaptive Threshold Image", adaptiveThreshImg);
waitKey(0);
return 0;
}
执行上面的代码,运行效果可参考下图。可以看到,经过自适应阈值处理后,图像的轮廓变得格外清晰。自适应阈值处理方法适用于复杂光照条件下图像的预处理,有助于提高后续图像分析和识别的准确率。
原文地址:https://blog.csdn.net/hope_wisdom/article/details/142318591
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!