【知识----OpenCV库中的阈值处理和形态学操作】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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中的有关于图像阈值处理和形态学操作的一些基本操作,如有不足之处,还请大家斧正!!!

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值