opencv学习--形态学,二值化,开运算,闭运算

一.全局二值化

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat cat = cv::imread("E:\\cv_tupian\\imgs2\\imgs\\cat2.jpg", cv::IMREAD_GRAYSCALE);
    cv::imshow("cat", cat);
// 全局二值化
    double thresh;
    cv::Mat dst1;
    cv::threshold(cat, dst1, 150, 255, cv::THRESH_BINARY);
    cv::imshow("dst1", dst1);
 // 等待按键事件
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

1.cv::threshold 函数及其参数解释

cv::threshold 函数用于将灰度图像转换为二值图像(黑白图像),根据指定的阈值将像素分为两类:前景和背景。

cv::threshold(cat, dst1, 150, 255, cv::THRESH_BINARY);
  • cat:输入图像,通常是灰度图像。
  • dst1:输出图像,存储二值化后的结果。
  • 150:阈值,用于决定像素是属于前景还是背景。
    • 如果像素值大于或等于150,则该像素被设置为最大值(255)。
    • 如果像素值小于150,则该像素被设置为最小值(0)。
  • 255:最大值,通常设置为255(白色),表示前景。
  • cv::THRESH_BINARY:阈值类型,表示使用二值化阈值处理方式。
    • cv::THRESH_BINARY:如果像素值大于阈值,则设为最大值;否则设为0。
    • 其他常见的阈值类型还包括:
      • cv::THRESH_BINARY_INV:与 cv::THRESH_BINARY 相反。
      • cv::THRESH_TRUNC:如果像素值大于阈值,则设为阈值;否则保持不变。
      • cv::THRESH_TOZERO:如果像素值大于阈值,则保持不变;否则设为0。
      • cv::THRESH_TOZERO_INV:与 cv::THRESH_TOZERO 相反。

二.自适应阈值二值化

自适应阈值二值化是一种图像处理技术,用于将灰度图像转换为二值图像(黑白图像)。与全局阈值二值化不同,自适应阈值二值化根据图像的局部区域动态调整阈值,从而更好地适应图像中的光照变化和其他不均匀性。这种方法特别适用于光照不均匀或背景复杂的图像。

1. cv::adaptiveThreshold

函数原型

cv::adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C);
  • src:输入图像,通常是灰度图像。
  • dst:输出图像,存储自适应二值化后的结果。
  • maxValue:最大值,通常设置为255(白色),表示前景。
  • adaptiveMethod:自适应阈值方法:
    • cv::ADAPTIVE_THRESH_MEAN_C:基于邻域内像素值的平均值。
    • cv::ADAPTIVE_THRESH_GAUSSIAN_C:基于邻域内像素值的加权和(权重为高斯窗口)。
  • thresholdType:阈值类型,通常为 cv::THRESH_BINARY 或 cv::THRESH_BINARY_INV
  • blockSize:块大小(必须是奇数),即用于计算阈值的邻域大小。
  • C:常数C,从计算出的阈值中减去的值。可以用来微调阈值。
示例代码
cv::Mat dst2;
    cv::adaptiveThreshold(cat, dst2, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 3, 0);
    cv::imshow("dst2", dst2);
  • cat:输入图像,通常是灰度图像。
  • dst2:输出图像,存储自适应二值化后的结果。
  • 255:最大值,通常设置为255(白色),表示前景。
  • cv::ADAPTIVE_THRESH_GAUSSIAN_C:自适应阈值方法,表示使用高斯加权均值作为阈值。
    • cv::ADAPTIVE_THRESH_GAUSSIAN_C:阈值是基于邻域内像素值的加权和(权重为高斯窗口),再减去一个常数C。
    • cv::ADAPTIVE_THRESH_MEAN_C:阈值是基于邻域内像素值的平均值,再减去一个常数C。
  • cv::THRESH_BINARY:阈值类型,表示使用二值化阈值处理方式。
    • 如果像素值大于计算出的阈值,则设为最大值(255);否则设为0。
  • 3:块大小(block size),即用于计算阈值的邻域大小(必须是奇数)。每个像素点的阈值是根据其周围 (3 \times 3) 区域内的像素值计算得出。
  • 0:常数C,从计算出的阈值中减去的值。可以用来微调阈值。

自适应阈值的优势
  • 适应局部变化:能够根据图像的局部区域动态调整阈值,适用于光照不均匀或背景复杂的图像。
  • 鲁棒性强:相比全局阈值方法,自适应阈值方法对噪声和光照变化有更好的鲁棒性。

参数选择的影响

  • 块大小(block size)
    • 较大的块大小会考虑更多的像素点,适合处理较大区域的变化。
    • 较小的块大小只考虑较少的像素点,适合处理较小区域的变化。
  • 常数C
    • 调整计算出的阈值,可以从阈值中减去或加上一个常数值,以微调最终的二值化效果。

三.腐蚀操作

腐蚀操作的作用
  • 缩小亮区域:腐蚀操作会缩小图像中的亮区域(前景),去除小的噪声点和孤立的像素。
  • 细化结构:通过多次腐蚀操作,可以细化图像中的结构,使其变得更细。
  • 去除噪声:腐蚀操作可以有效去除图像中的小噪声点。

代码

 // 腐蚀操作
    cv::Mat kernel_1 = cv::Mat::ones(3, 3, CV_8U);
    cv::Mat dst3;
    cv::erode(img1, dst3, kernel_1, cv::Point(-1, -1), 1);
    cv::imshow("dst3", dst3);

1.cv::Mat::ones

  • cv::Mat::ones(3, 3, CV_8U):创建一个 (3 \times 3) 的矩阵,所有元素初始化为1。
    • 3, 3:矩阵的大小,即结构元素的大小。
    • CV_8U:矩阵的数据类型,表示8位无符号整数(0到255)。

2.cv::erode(img1, dst3, kernel_1, cv::Point(-1, -1), 1);

  • img1:输入图像。
  • dst3:输出图像,存储腐蚀操作后的结果。
  • kernel_1:结构元素(kernel),用于定义腐蚀操作的邻域。
  • cv::Point(-1, -1):锚点位置,表示结构元素的中心。
    • cv::Point(-1, -1):默认值,表示结构元素的中心位于其几何中心。
  • 1:迭代次数,表示腐蚀操作的重复次数。
    • 1:表示进行一次腐蚀操作。
    • 可以设置为更大的值以进行多次腐蚀操作。

参数选择的影响

  • 结构元素的大小
    • 较大的结构元素会更显著地缩小亮区域,适用于去除较大的噪声或结构。
    • 较小的结构元素只会轻微地缩小亮区域,适用于精细的结构处理。
  • 迭代次数
    • 较多的迭代次数会更显著地缩小亮区域,适用于去除更多的噪声或结构。
    • 较少的迭代次数只会轻微地缩小亮区域,适用于轻微的结构处理。

四. 获取形态学卷积核

// 获取形态学卷积核
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

1.cv::getStructuringElement 函数用于创建一个结构元素(kernel),该结构元素在形态学操作中用于定义邻域的形状和大小。

  • cv::MORPH_RECT:结构元素的形状。
    • cv::MORPH_RECT:矩形结构元素。(常用这个)
    • cv::MORPH_ELLIPSE:椭圆形结构元素。
    • cv::MORPH_CROSS:十字形结构元素。
  • cv::Size(5, 5):结构元素的大小。
    • cv::Size(width, height):定义了结构元素的宽度和高度。
    • 在这个例子中,结构元素是一个 (5 *5) 的矩形。
2. 结构元素的作用

结构元素在形态学操作中用于定义操作的邻域。常见的形态学操作包括:

  • 膨胀(Dilation):扩大图像中的亮区域。
  • 腐蚀(Erosion):缩小图像中的亮区域。
  • 开运算(Opening):先腐蚀后膨胀,用于去除小的噪声点。
  • 闭运算(Closing):先膨胀后腐蚀,用于填充小的空洞。

结构元素的形状和大小会影响形态学操作的结果:

  • 矩形结构元素(cv::MORPH_RECT:适用于大多数情况,操作简单且计算效率高。
  • 椭圆形结构元素(cv::MORPH_ELLIPSE:适用于需要更平滑效果的情况。
  • 十字形结构元素(cv::MORPH_CROSS:适用于特定的形态学操作,如去除细线。

五.膨胀操作

 膨胀操作的作用

  • 扩大亮区域:膨胀操作会扩大图像中的亮区域(前景),填补小的空洞或连接相邻的亮区域。
  • 增强结构:通过多次膨胀操作,可以增强图像中的结构,使其变得更粗。
  • 去除噪声:膨胀操作可以有效去除图像中的小空洞或孤立的背景点。
 // 膨胀操作
    cv::Mat dst4;
    cv::dilate(img2, dst4, kernel, cv::Point(-1, -1), 1);
    cv::imshow("dst4", dst4);
  • cv::dilate 函数
    • img2:输入图像,通常是灰度图像或二值图像。
    • dst4:输出图像,存储膨胀操作后的结果。
    • kernel:结构元素(kernel),用于定义膨胀操作的邻域。
    • cv::Point(-1, -1):锚点位置,表示结构元素的中心。
      • cv::Point(-1, -1):默认值,表示结构元素的中心位于其几何中心。
    • 1:迭代次数,表示膨胀操作的重复次数。
      • 1:表示进行一次膨胀操作。
      • 可以设置为更大的值以进行多次膨胀操作。

参数选择的影响

  • 结构元素的大小
    • 较大的结构元素会更显著地扩大亮区域,适用于填补较大的空洞或连接较大的结构。
    • 较小的结构元素只会轻微地扩大亮区域,适用于精细的结构处理。
  • 迭代次数
    • 较多的迭代次数会更显著地扩大亮区域,适用于填补更多的空洞或连接更多的结构。
    • 较少的迭代次数只会轻微地扩大亮区域,适用于轻微的结构处理。

六.开运算 = 先腐蚀 后膨胀

开运算的作用
  • 去除小噪声点:通过先腐蚀再膨胀,可以去除图像中的小噪声点和孤立的像素。
  • 平滑轮廓:开运算可以平滑图像的轮廓,去除小的物体或填补小的空洞。
  • 保留较大结构:开运算保留了图像中的较大结构,适用于去除细小的细节或噪声。
cv::Mat dst5;
cv::morphologyEx(img1, dst5, cv::MORPH_OPEN, kernel, cv::Point(-1, -1), 1); // 进行一次开运算
cv::imshow("dst5", dst5); // 显示开运算后的图像

详细参数解释

  • img1:输入图像,通常是灰度图像或二值图像。
  • dst5:输出图像,存储开运算后的结果。
  • cv::MORPH_OPEN:形态学操作的类型,表示进行开运算。
  • kernel:结构元素(kernel),用于定义操作的邻域。在这个例子中,kernel 是一个 (5 \times 5) 的矩形结构元素。
  • cv::Point(-1, -1):锚点位置,表示结构元素的中心。默认值 cv::Point(-1, -1) 表示结构元素的中心位于其几何中心。
  • 1:迭代次数,表示开运算的重复次数。在这个例子中,只进行一次开运算。

六 .闭运算 = 先膨胀 后腐蚀

闭运算是形态学操作的一种,通过先进行膨胀操作再进行腐蚀操作来填补图像中的小空洞和连接相邻的亮区域,同时保留图像中的较大结构。闭运算可以用于平滑图像的轮廓,填补小的空洞或连接小的断开部分。

 cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat dst6;
    cv::morphologyEx(img2, dst6, cv::MORPH_CLOSE, kernel, cv::Point(-1, -1), 1);
    cv::imshow("dst6", dst6);
 函数参数解释
  • cv::morphologyEx 函数
    • img2:输入图像,通常是灰度图像或二值图像。
    • dst6:输出图像,存储闭运算后的结果。
    • cv::MORPH_CLOSE:形态学操作的类型,表示进行闭运算。
    • kernel:结构元素(kernel),用于定义操作的邻域。
    • cv::Point(-1, -1):锚点位置,表示结构元素的中心。
      • cv::Point(-1, -1):默认值,表示结构元素的中心位于其几何中心。
    • 1:迭代次数,表示闭运算的重复次数。
      • 1:表示进行一次闭运算。
      • 可以设置为更大的值以进行多次闭运算。

七.形态学梯度 = 原图 - 腐蚀, 获得更清晰的边缘

  • 形态学梯度的定义是通过原图与腐蚀后的图像相减得到,可以突出显示物体的边缘。
  • 代码中使用了OpenCV库的cv::morphologyEx函数来执行形态学梯度操作。
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat dst7;
    cv::morphologyEx(img1, dst7, cv::MORPH_GRADIENT, kernel, cv::Point(-1, -1), 1);
    cv::imshow("dst7", dst7);
  • cv::morphologyEx(img1, dst7, cv::MORPH_GRADIENT, kernel, cv::Point(-1, -1), 1);: 调用cv::morphologyEx函数进行形态学梯度操作。参数解释:
    • img1: 输入图像。
    • dst7: 输出图像。
    • cv::MORPH_GRADIENT: 指定操作类型为形态学梯度。
    • kernel: 结构元素(内核),用于定义形态学操作的邻域。
    • cv::Point(-1, -1): 锚点位置,默认为中心点。
    • 1: 迭代次数。

八.顶帽 = 原图 - 开运算,开运算去除外部噪点,顶帽操作后得到去掉的外部噪点

  • 顶帽操作 的定义是通过原图与开运算后的图像相减得到,可以突出显示图像中的亮细节或外部噪点。
  • 代码中使用了OpenCV库的cv::morphologyEx函数来执行顶帽操作。
// 顶帽 = 原图 - 开运算,开运算去除外部噪点,顶帽操作后得到去掉的外部噪点
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat dst8;
    cv::morphologyEx(img1, dst8, cv::MORPH_TOPHAT, kernel, cv::Point(-1, -1), 1);
    cv::imshow("dst8", dst8);

cv::morphologyEx函数进行顶帽操作。参数解释:

  • img1: 输入图像。
  • dst8: 输出图像。
  • cv::MORPH_TOPHAT: 指定操作类型为顶帽。
  • kernel: 结构元素(内核),用于定义形态学操作的邻域。
  • cv::Point(-1, -1): 锚点位置,默认为中心点。
  • 1: 迭代次数。

九.黑帽 = 原图 - 闭运算,闭运算去除内部噪点,黑帽操作后得到去掉的内部噪点

cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat dst9;
    cv::morphologyEx(img2, dst9, cv::MORPH_BLACKHAT, kernel, cv::Point(-1, -1), 1);
    cv::imshow("dst9", dst9);
  • cv::morphologyEx(img1, dst9, cv::MORPH_BLACKHAT, kernel, cv::Point(-1, -1), 1): 调用cv::morphologyEx函数进行黑帽操作。参数解释:
    • img1: 输入图像。
    • dst9: 输出图像。
    • cv::MORPH_BLACKHAT: 指定操作类型为黑帽。
    • kernel: 结构元素(内核),用于定义形态学操作的邻域。
    • cv::Point(-1, -1): 锚点位置,默认为中心点。
    • 1: 迭代次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值