提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉和机器学习软件库。它提供了一套全面的工具,用于图像和视频处理、计算机视觉以及机器学习。
阈值处理和形态学操作是图像处理中常见的技术,用于图像增强和特征提取。
下面对这两种技术进行详细介绍:
1. 阈值处理:
阈值处理是将图像中的像素值转换为二值(0或255)的过程,通过设定一个阈值来分割图像。
这种处理常用于图像的分割、目标检测和简化图像。
常见的阈值处理函数:
简单阈值处理 (cv::threshold):
这个函数用于将图像进行简单的二值化,将大于阈值的像素设置为一个值,小于阈值的像素设置为另一个值。
cv::threshold(grayImage, binaryImage, thresholdValue, maxValue, cv::THRESH_BINARY);
参数解释:
grayImage:输入灰度图像。
binaryImage:输出二值化图像。
thresholdValue:阈值。
maxValue:大于阈值的像素设置为的值。
cv::THRESH_BINARY:二值化类型,表示大于阈值的像素设置为 maxValue,小于阈值的像素设置为 0。
案例
#include <opencv2/opencv.hpp>
int main() {
cv::Mat grayImage = cv::imread("input_image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat binaryImage;
if (grayImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 简单阈值处理
cv::threshold(grayImage, binaryImage, 128, 255, cv::THRESH_BINARY);
cv::imshow("Original Gray Image", grayImage);
cv::imshow("Binary Image", binaryImage);
cv::waitKey(0);
return 0;
}
这个例子中,cv::threshold 函数用于将灰度图像二值化,大于阈值128的像素设置为255,小于阈值的像素设置为0。
自适应阈值 (cv::adaptiveThreshold):
这个函数用于根据图像局部区域的特性进行自适应阈值处理,常用于处理光照变化较大的图像。
cv::adaptiveThreshold(grayImage, adaptiveBinaryImage, maxValue, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, blockSize, c);
参数解释:
grayImage:输入灰度图像。
adaptiveBinaryImage:输出自适应阈值处理后的图像。
maxValue:大于阈值的像素设置为的值。
cv::ADAPTIVE_THRESH_GAUSSIAN_C:自适应阈值的方法,使用高斯加权平均。
cv::THRESH_BINARY:二值化类型。
blockSize:区域大小,表示计算局部块的均值的邻域大小。
c:从均值或加权均值减去的常数。
案例
#include <opencv2/opencv.hpp>
int main() {
cv::Mat grayImage = cv::imread("input_image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat adaptiveBinaryImage;
if (grayImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 自适应阈值处理
cv::adaptiveThreshold(grayImage, adaptiveBinaryImage, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 11, 2);
cv::imshow("Original Gray Image", grayImage);
cv::imshow("Adaptive Binary Image", adaptiveBinaryImage);
cv::waitKey(0);
return 0;
}
这个例子中,cv::adaptiveThreshold 函数用于对灰度图像进行自适应阈值处理,使用高斯加权平均,blockSize 设置为11,c 设置为2。
应用场景
分割目标和背景。
二值化图像用于形状识别。
去除图像中的噪声。
2.形态学操作:
形态学操作是基于形状的图像处理技术,主要包括腐蚀、膨胀、开运算、闭运算等。
这些操作能够改变图像中物体的形状和结构,用于图像去噪、边缘检测和物体提取。
常见的形态学操作函数:
腐蚀和膨胀 (cv::erode 和 cv::dilate):
这两个函数用于进行图像的腐蚀和膨胀操作,通常用于形态学处理。
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(kernelSizeX, kernelSizeY));
cv::erode(binaryImage, erodedImage, kernel);
cv::dilate(binaryImage, dilatedImage, kernel);
参数解释:
binaryImage:二值化图像。
erodedImage:腐蚀后的图像。
dilatedImage:膨胀后的图像。
kernel:形态学操作的结构元素,可以使用 cv::getStructuringElement 创建。
案例
#include <opencv2/opencv.hpp>
int main() {
cv::Mat binaryImage = cv::imread("binary_image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat erodedImage, dilatedImage;
if (binaryImage.empty()) {
std::cerr << "Error: Unable to load the binary image." << std::endl;
return -1;
}
// 创建形态学操作的结构元素
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
// 腐蚀操作
cv::erode(binaryImage, erodedImage, kernel);
// 膨胀操作
cv::dilate(binaryImage, dilatedImage, kernel);
cv::imshow("Original Binary Image", binaryImage);
cv::imshow("Eroded Image", erodedImage);
cv::imshow("Dilated Image", dilatedImage);
cv::waitKey(0);
return 0;
}
这个例子中,cv::erode 和 cv::dilate 函数分别用于对二值化图像进行腐蚀和膨胀操作,通过设置合适的结构元素(kernel)来调整操作效果。
更复杂的形态学操作 (cv::morphologyEx):
这个函数用于实施更复杂的形态学操作,如开运算、闭运算等。
cv::morphologyEx(inputImage, outputImage, operation, kernel);
参数解释:
inputImage:输入图像。
outputImage:输出图像。
operation:形态学操作类型,如 cv::MORPH_OPEN 表示开运算,cv::MORPH_CLOSE 表示闭运算。
kernel:形态学操作的结构元素,可以使用 cv::getStructuringElement 创建。
案例
#include <opencv2/opencv.hpp>
int main() {
cv::Mat inputImage = cv::imread("input_image.jpg");
cv::Mat outputImage;
if (inputImage.empty()) {
std::cerr << "Error: Unable to load the input image." << std::endl;
return -1;
}
// 创建形态学操作的结构元素
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
// 开运算
cv::morphologyEx(inputImage, outputImage, cv::MORPH_OPEN, kernel);
cv::imshow("Original Image", inputImage);
cv::imshow("Opened Image", outputImage);
cv::waitKey(0);
return 0;
}
这个例子中,cv::morphologyEx 函数用于进行开运算,通过设置合适的结构元素(kernel)来调整操作效果。
应用场景
消除图像中的小对象或细小的噪声。
连接相邻的对象。
提取图像中的边缘信息。
填充图像中的空洞。
总结
这两种技术常常结合使用,例如先通过阈值处理将图像转为二值图像,然后利用形态学操作进行进一步的图像处理,以实现更复杂的任务,如目标检测、轮廓提取等。
以上就是OpenCV中的有关于图像阈值处理和形态学操作的一些基本操作,如有不足之处,还请大家斧正!!!