Opencv-C++笔记 (5) : opencv-形态学

这篇具有很好参考价值的文章主要介绍了Opencv-C++笔记 (5) : opencv-形态学。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、形态学运算与结构

形态学运算是针对二值图像依据数学形态学(Mathematical
Morphology)的集合论方法发展起来的图像处理方法。数学形态学起源于岩相学对岩石结构的定量描述工作,近年来在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析方法和理论。

结构元素可以简单的定义为像素的组合,在对应的像素上定义了原点(也称锚点)。形态学滤波器的应用过程就是利用这个结构元素探测图像中每个像素的操作过程。把某个像素设为结构元素的锚点后,结构元素和图像重叠部分的像素集合就是特定形态学运算的应用对象。结构元素原则上可以是任何形状,但通常是一个简单形状,如正方形、圆形、菱形等,且把中心点作为原点。

膨胀与腐蚀的区别:膨胀只要有交集就触发,而腐蚀必须是重置点与前景像素有完全重合区域才保留。
Opencv-C++笔记 (5) : opencv-形态学

2、腐蚀膨胀运算

腐蚀的定义
用3×3的核去扫描二值图像,仅当核的与前景像素有完全重合区域时,将二值图像中对应的卷积核中心位置的像素保留,其余情况下,将中心位置的像素置0。

     拓展:卷积核可以为任意形状,且重置点可以选用卷积核中的任意位置

Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学

void cv::erode	(	InputArray 	src,
                    OutputArray 	dst,
                    InputArray 	kernel,
                    Point 	anchor = Point(-1,-1),
                    int 	iterations = 1,
                    int 	borderType = BORDER_CONSTANT,
                    const Scalar & 	borderValue = morphologyDefaultBorderValue() 
                    )	

也就是说,由B对X腐蚀所产生的二值图像E是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么B将完全包含于X中。

另一种理解,腐蚀就是把当前像素替换成所定义的像素集中的最小像素值。由于输入的二值图像只包含黑色(0)和白色(255)像素,因此如果结构元素覆盖的图像区域中有黑色像素,则锚点所在像素(x,y)将会被替换成黑色0,否则替换成白色255。而物体的边界通常会有黑色像素,所以腐蚀相当于收缩边界。

腐蚀作用:腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体

// Read input image  
    cv::Mat image= cv::imread("binary.bmp");  
    if (!image.data)  
        return 0;   
// Display the image  
    cv::namedWindow("Image");  
    cv::imshow("Image",image);  
// Erode the image  
    cv::Mat eroded;  
    cv::erode(image,eroded,cv::Mat());//cv::Mat()为空矩阵,此时采用默认3*3正方形结构元素  
// Display the eroded image  
    cv::namedWindow("Eroded Image");  
    cv::imshow("Eroded Image",eroded);  
// Erode the image with a larger s.e.定义更大的结构元素  
    cv::Mat element(7,7,CV_8U,cv::Scalar(1));  
 // Display the eroded image by large s.e.  
    cv::erode(image,eroded,element);  
    cv::namedWindow("Eroded Image (7x7)");  
    cv::imshow("Eroded Image (7x7)",eroded);  
// Erode the image 3 times.腐蚀3次  
    cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);//cv::Point(-1,-1)表示原点是矩阵的中心点  
// Display the eroded image  
    cv::namedWindow("Eroded Image (3 times)");  
    cv::imshow("Eroded Image (3 times)",eroded);  
    cv::waitKey(0);  

Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学

3、膨胀

膨胀的定义
用3×3的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有交集时,则将二值图像中对应的卷积核中心位置的像素值置为1。

    拓展:卷积核可以为任意形状(除1×1),且重置点可以选用卷积核中的任意位置,有‘交集‘就对重置点位置像素置1。

Opencv-C++笔记 (5) : opencv-形态学void

cv::dilate	(	InputArray 	src,
                    OutputArray 	dst,
                    InputArray 	kernel,
                    Point 	anchor = Point(-1,-1),
                    int 	iterations = 1,
                    int 	borderType = BORDER_CONSTANT,
                    const Scalar & 	borderValue = morphologyDefaultBorderValue() 
                    )

Opencv-C++笔记 (5) : opencv-形态学

由B对X膨胀所产生的二值图像D是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么它与X的交集非空。

另一种理解为:膨胀是腐蚀的反运算,它把当前像素(原点所在位置(x,y))替换成所定义的像素集中的最大像素值。由于输入的二值图像只包含黑色(0)和白色(255)像素,因此当结构元素覆盖的图像中有白色(物体),则该结构元素原点所在位置(x,y)的值将会被替换成白色255。

膨胀的作用:也就是说,膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞

// Dilate the image  
    cv::Mat dilated;  
    cv::dilate(image,dilated,cv::Mat());  
// Display the dialted image  
    cv::namedWindow("Dilated Image");  
    cv::imshow("Dilated Image",dilated); 

Opencv-C++笔记 (5) : opencv-形态学

4、自定义结构元素

除了使用常规的规则结构元素,我们也可以自定义结构元素。下面使用Mat类型的构造函数创建一个3×3十字型的结构元素

// 创建自定义结构元素  
unsigned char m[9] = {  
        0,1,0,  
        1,1,1,  
        0,1,0     
    };  
cv::Mat element1(3,3,CV_8U,m); //创建自定义矩阵element1  
//显示该结构元素  
int nr = element1.rows;  
int nl = element1.cols;  
for(int j = 0;j<nr;j++)  
{  
    char *data = element1.ptr<char>(j);  
    for(int i = 0; i<nl; i++)  
    {  
        int value = data[i];  
        cout<<value<<" ";  
}  
    cout<<endl;  
}  
 // Display the eroded image by large s.e.  
    cv::erode(image,eroded,element1);  
    cv::namedWindow("Eroded Image (user define)");  
    cv::imshow("Eroded Image (user define)",eroded);  

Opencv-C++笔记 (5) : opencv-形态学

使用Mat_模板类自定义5×5大小十字形、菱形、方形、x形结构元素:

   cv::Mat_<uchar> cross(5,5);  
    cv::Mat_<uchar> diamond(5,5);  
    cv::Mat_<uchar> x(5,5);  
    cv::Mat_<uchar> square(5,5);  
  
     // Creating the cross-shaped structuring element  
    cross <<  
          0, 0, 1, 0, 0,  
          0, 0, 1, 0, 0,  
          1, 1, 1, 1, 1,  
          0, 0, 1, 0, 0,  
          0, 0, 1, 0, 0;  
            
     // Creating the diamond-shaped structuring element  
     diamond <<  
          0, 0, 1, 0, 0,  
          0, 1, 1, 1, 0,  
          1, 1, 1, 1, 1,  
          0, 1, 1, 1, 0,  
          0, 0, 1, 0, 0;  
            
      // Creating the x-shaped structuring element  
      x <<  
          1, 0, 0, 0, 1,  
          0, 1, 0, 1, 0,  
          0, 0, 1, 0, 0,  
          0, 1, 0, 1, 0,  
          1, 0, 0, 0, 1;  
  
      // Creating the square-shaped structuring element  
      square <<  
          1, 1, 1, 1, 1,  
          1, 1, 1, 1, 1,  
          1, 1, 1, 1, 1,  
          1, 1, 1, 1, 1,  
          1, 1, 1, 1, 1;  
<span style="white-space:pre">    </span> //display x-shaped structuring element  
     cout<<endl<<"x-shaped structuring element"<<endl<<endl;  
     int xnr = x.rows;  
     int xnl = x.cols;  
     for(int j = 0;j<nr;j++)  
     {  
        char *data = x.ptr<char>(j);  
        for(int i = 0; i<nl; i++)  
        {  
            int value = data[i];  
            cout<<value<<" ";  
        }  
        cout<<endl;  
     }  

5、开闭运算

void cv::morphologyEx	(	InputArray 	src,
                            OutputArray 	dst,
                            int 	op,
                            InputArray 	kernel,
                            Point 	anchor = Point(-1,-1),
                            int 	iterations = 1,
                            int 	borderType = BORDER_CONSTANT,
                            const Scalar & 	borderValue = morphologyDefaultBorderValue() 
                            )
                            对于输入参数op(形态学运算类型)有以下几种参数可以设置:

MORPH_ERODE(腐蚀)
MORPH_DILATE(膨胀)
MORPH_OPEN(开运算)
MORPH_CLOSE(闭运算)
MORPH_GRADIENT(形态学梯度,即膨胀图减腐蚀图)
MORPH_TOPHAT(顶帽运算)
MORPH_BLACKHAT(底帽运算)
MORPH_HITMISS(击中与击不中)

void QuickDemo::open_close(Mat& image)
{
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
namedWindow(“THRESH_OTSU”, WINDOW_FREERATIO);
imshow(“THRESH_OTSU”, binary);

Mat dst1, dst2;
//定义核
int kernel_size = 5;
Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
//开
morphologyEx(binary, dst1, MORPH_OPEN, kernel, Point(-1, -1), 1, 0);
namedWindow("MORPH_OPEN", WINDOW_FREERATIO);
imshow("MORPH_OPEN", dst1);

//闭、
morphologyEx(binary, dst2, MORPH_CLOSE, kernel, Point(-1, -1), 1, 0);
namedWindow("MORPH_CLOSE", WINDOW_FREERATIO);
imshow("MORPH_CLOSE", dst2);

}

Opencv-C++笔记 (5) : opencv-形态学

开运算

先腐蚀后膨胀
Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学

开运算作用:
用来背景中的消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。所有小到不能容纳结构元素的物体都会被移除。

void erode_dilate(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);
 
	Mat dst1, dst2;
	//定义核
	int kernel_size = 5;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	//腐蚀
	erode(binary, dst1, kernel);
	namedWindow("erode", WINDOW_FREERATIO);
	imshow("erode", dst1);
 
	//膨胀
	dilate(binary, dst2, kernel);
	namedWindow("dilate", WINDOW_FREERATIO);
	imshow("dilate", dst2);
}

Opencv-C++笔记 (5) : opencv-形态学

cv::Mat element5(5,5,CV_8U,cv::Scalar(1));//5*5正方形,8位uchar型,全1结构元素  
cv::Mat opened;  
cv::morphologyEx(image, opened,cv::MORPH_OPEN,element5);  
// Display the opened image  
cv::namedWindow("Opened Image");  
cv::imshow("Opened Image",opened);  
cv::waitKey(0); 

Opencv-C++笔记 (5) : opencv-形态学

闭运算

先膨胀后腐蚀
Opencv-C++笔记 (5) : opencv-形态学
Opencv-C++笔记 (5) : opencv-形态学

cv::Mat element5(5,5,CV_8U,cv::Scalar(1));//5*5正方形,8位uchar型,全1结构元素  
cv::Mat closed;  
cv::morphologyEx(image, closed,cv::MORPH_CLOSE,element5);//高级形态学运算函数  
// Display the opened image  
cv::namedWindow("Closed Image");  
cv::imshow("Closed Image",closed);  
cv::waitKey(0); 

Opencv-C++笔记 (5) : opencv-形态学

6、形态学梯度

注:在边缘提取应用中,梯度边缘后,会再进行二值化,从而获取更好的边缘图像。
基本梯度:膨胀图 - 腐蚀图

内梯度:原图 - 腐蚀图

外梯度:膨胀图 - 原图
作用:
基本梯度(图像膨胀与腐蚀操作之间的差值)
内梯度(输入图像与腐蚀之间的差值)
外梯度(膨胀与输入图像之间的差值)
这里opencv只能直接实现基本梯度,在使用API:morphologyEx 时,调用MORPH_GRADIENT方法即可。
内梯度、外梯度没有直接的API,一般通过已有API间接实现。

void QuickDemo::shape_gradient(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
 
	Mat g1, g2, g3;
	Mat dst1, dst2;
	int kernel_size = 7;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
	
	//基本梯度
	morphologyEx(gray, g1, MORPH_GRADIENT, kernel, Point(-1, -1), 1, 0);
 
	//膨胀
	morphologyEx(gray, dst1, MORPH_DILATE, kernel, Point(-1, -1), 1, 0);
 
	//腐蚀
	morphologyEx(gray, dst2, MORPH_ERODE, kernel, Point(-1, -1), 1, 0);
 
	//外梯度
	subtract(dst1, gray, g2);
	//内梯度
	subtract(gray, dst2, g3);
 
	namedWindow("基本梯度", WINDOW_FREERATIO);
	imshow("基本梯度", g1);
 
	namedWindow("外梯度", WINDOW_FREERATIO);
	imshow("外梯度", g2);
 
	namedWindow("内梯度", WINDOW_FREERATIO);
	imshow("内梯度", g3);
 
	//最后再进行二值化,获取更好的边缘图像,选用基本梯度示例
	Mat binary;
	threshold(g1, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);
}

Opencv-C++笔记 (5) : opencv-形态学

7、其他形态学-顶帽、黑帽、击中不击中

顶帽:原图 - 开操作后的图
1️⃣:得到开运算消除的区域(检查开运算效果)
2️⃣:校正不均匀光照的影响(用于暗背景上的亮物体,去光差)

黑帽:闭操作后的图 - 原图
1️⃣:闭运算是去噪点的过程,所以黑帽操作实质上保留的是噪点的部分。
2️⃣:校正不均匀光照的影响(用于亮(白)背景上的暗物体)
注:顶帽和黑帽操作用于获取图像中的微小细节。

击中击不中: 通过特定模板,仅当输入的图像中,有与模板一模一样的块时,被击中的输入图像区域才会被保留。
中击不中变换是形态学中用来检测特定形状所处位置的一个基本工具。它的原理就是使用腐蚀;如果要在一幅图像A上找到B形状的目标,我们要做的是:

首先,建立一个比B大的结构元素B1;使用B1对图像A进行腐蚀,得到图像假设为A_B1;
其次,用B减去B1,从而得到结构元素B2(B2-B);使用B2对图像A的补集进行腐蚀,得到图像假设为A_B2;
然后,A_B1与A_B2取交集;得到的结果就是B的位置。

Opencv-C++笔记 (5) : opencv-形态学


void QuickDemo::other_method(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("二值化", WINDOW_FREERATIO);
	imshow("二值化", binary);
 
	Mat dst1, dst2, dst3;
	int kernel_size = 5;
	Mat kernel_1 = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));
 
	//顶帽
	morphologyEx(binary, dst1, MORPH_TOPHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("顶帽", WINDOW_FREERATIO);
	imshow("顶帽", dst1);
	//黑帽
	morphologyEx(binary, dst2, MORPH_BLACKHAT, kernel_1, Point(-1, -1), 1, 0);
	namedWindow("黑帽", WINDOW_FREERATIO);
	imshow("黑帽", dst2);
 
	//击中击不中
	Mat kernel_2 = getStructuringElement(MORPH_CROSS, Size(kernel_size, kernel_size), Point(-1, -1));
	morphologyEx(binary, dst3, MORPH_HITMISS, kernel_2, Point(-1, -1), 1, 0);
	namedWindow("击中击不中", WINDOW_FREERATIO);
	imshow("击中击不中", dst3);
}

Opencv-C++笔记 (5) : opencv-形态学

Mat src = imread("D:/opencv练习图片/击中与击不中.png");
    imshow("原图", src);
    // 二值图像
    Mat gray, binary, hitImg;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    //高斯滤波
    Mat gauss;
    GaussianBlur(gray, gauss, Size(5, 5), 0, 0);
    //二值化
    threshold(gauss, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
    imshow("binary", binary);
    // 定义结构元素
    Mat se = getStructuringElement(MORPH_CROSS, Size(11, 11), Point(-1, -1));
    // 击中击不中
    morphologyEx(binary, hitImg, MORPH_HITMISS, se);
    imshow("击中击不中", hitImg);
    //膨胀一下
    Mat openImg;
    Mat kern2 = getStructuringElement(MORPH_RECT, Size(3, 3));
    morphologyEx(hitImg, openImg, MORPH_OPEN, kern2, Point(-1, -1), 2);
    imshow("dilate", openImg);
    //寻找轮廓
    vector<vector<Point>>contours;
    vector<Vec4i>hie;
    findContours(openImg, contours, hie, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
    for (size_t i = 0; i < contours.size(); i++)
    {
        double area = contourArea(contours[i]);
        if (area < 20.0)continue;
        Rect rect = boundingRect(contours[i]);
        rectangle(src, rect, Scalar(0, 0, 255), 1, 8);
 
    }
    // 显示
    imshow("结果", src);

Opencv-C++笔记 (5) : opencv-形态学

8、核函数

使用cv2.getStructuringElement()生成不同结构的核

import cv2

矩形核

kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)
get_show(kernel1)
Opencv-C++笔记 (5) : opencv-形态学

十字形核

kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
Opencv-C++笔记 (5) : opencv-形态学

椭圆核

kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1000, 1000))
Opencv-C++笔记 (5) : opencv-形态学

参考:https://blog.csdn.net/qq_33287871/article/details/112761328?ops_request_misc=&request_id=&biz_id=102&utm_term=opencv%E5%BD%A2%E6%80%81%E5%AD%A6%E5%A4%84%E7%90%86c++&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-112761328.142v88control_2,239v2insert_chatgpt&spm=1018.2226.3001.4187文章来源地址https://www.toymoban.com/news/detail-488020.html

到了这里,关于Opencv-C++笔记 (5) : opencv-形态学的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

    大家看这篇博文前可以先看一看下面这篇博文,下面这篇博文是这篇博文的基础: 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作 图像形态学腐蚀可以将细小的噪声区域去除,但是会将图像主要区域

    2024年02月06日
    浏览(58)
  • 我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

    例如,设定阈值为127,然后:  将图像内所有像素值大于 127 的像素点的值设为 255。  将图像内所有像素值小于或等于 127 的像素点的值设为 0。 cv2.threshold() 和 cv2.adaptiveThreshold() 是 OpenCV 中用于实现阈值处理的两个函数,它们之间有以下区别: 1.1.1. cv2.threshold(): 这个函数

    2024年02月05日
    浏览(58)
  • opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

    闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的闭运算),其中: 左图是原始图像。 中间的图是对原

    2024年02月14日
    浏览(73)
  • OpenCV 形态学

    形态学处理之前需要将图像进行二值化处理, 然后我们需要设定一个卷积核, 最后将像素上每个点都完成卷积计算. 形态学很多高级处理的基础, 有很多作用: 消除毛刺、填充空隙、检测边缘,检查拐角(使用十字形卷积核) 腐蚀作用和膨胀相反, 用来腐蚀减小白色区域, 常用来消

    2024年02月22日
    浏览(38)
  • OpenCV 09(形态学)

    形态学指一系列处理图像 形状特征 的图像处理技术. 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。 这些处理方法基本是对 二进制图像 进行处理, 即黑白图像 卷积核决定着图

    2024年02月07日
    浏览(62)
  • OpenCV之形态学操作

    形态学操作包含以下操作: 腐蚀 (Erosion) 膨胀 (Dilation) 开运算 (Opening) 闭运算 (Closing) 形态梯度 (Morphological Gradient) 顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作,其他操作由这两个操作变换而来。         用一个结构元素扫描图像中每一个像素,结构元素

    2024年02月09日
    浏览(51)
  • OpenCv之图像形态学

    目录 一、形态学  二、图像全局二值化  三、自适应阈值二值化 四、腐蚀操作 五、获取形态学卷积核 六、膨胀操作 七、开运算 八、闭运算 定义: 指一系列处理图像形状特征的图像处理技术 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图

    2024年02月16日
    浏览(38)
  • OpenCV(三十一):形态学操作

    ​​​​​​1.形态学操作        OpenCV 提供了丰富的函数来进行形态学操作,包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数: 腐蚀操作(Erosion): erode(src, dst, kernel, anchor, iterations, borderType, borderValue) 该函数对输入图像中的前景区域进行

    2024年02月09日
    浏览(52)
  • OpenCV17-图像形态学操作

    图像腐蚀(Image erosion)可用于减小图像中物体的大小、填充孔洞或者分离邻近的物体。腐蚀操作通过对图像中的每个像素应用结构元素(也称为腐蚀内核)来实现。 腐蚀操作的原理是将结构元素与图像进行逐像素的比较。如果结构元素的所有像素与图像中对应位置的像素都

    2024年02月08日
    浏览(50)
  • opencv获取形态学卷积核

    获取形态学卷积核,这个函数是用来创建自定义形状的卷积核(也称为结构元素),这些核可以用在形态学操作比如腐蚀和膨胀中。 cv2.getStructuringElement(shape, ksize[, anchor]) shape:卷积核形状, cv2.MORPH_RECT: 矩形结构元素 cv2.MORPH_CROSS: 交叉形结构元素 cv2.MORPH_ELLIPSE: 椭圆形结构元素

    2024年04月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包