gpt4 book ai didi

OpenCV实现图像腐蚀

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 42 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章OpenCV实现图像腐蚀由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

图像的腐蚀过程与图像的卷积操作类似,都需要模板矩阵来控制运算的结果,在图像的腐蚀和膨胀中这个模板矩阵被称为结构元素。与图像卷积相同,结构元素可以任意指定图像的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己定义。定义结构元素之后,将结构元素的中心点依次放到图像中每一个非0元素处,如果此时结构元素内所有的元素所覆盖的图像像素值均不为0,则保留结构元素中心点对应的图像像素,否则将删除结构元素中心点对应的像素。图像的腐蚀过程示意图如图6-12所示,图6-12中左侧为待腐蚀的原图像,中间为结构元素,首先将结构元素的中心与原图像中的A像素重合,此时结构元素中心点的左侧和上方元素所覆盖的图像像素值均为0,因此需要将原图像中的A像素删除;当把结构元素的中心点与B像素重合时,此时结构元素中所有的元素所覆盖的图像像素值均为1,因此保留原图像中的B像素。将结构元素中心点依次与原图像中的每个像素重合,判断每一个像素点是否保留或者删除,最终原图像腐蚀的结果如图中右侧图像所示.

OpenCV实现图像腐蚀

图像腐蚀可以用“Θ”表示,其数学表示形式如式(6.4)所示,通过公式可以发现,其实对图像A的腐蚀运算就是寻找图像中能够将结构元素B全部包含的像素点.

OpenCV实现图像腐蚀

生成常用的矩形结构元素、十字结构元素和椭圆结构:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
  • shape:结构元素的种类,可以选择的参数及含义在表6-5中给出。
  • ksize:结构元素的尺寸大小
  • anchor:中心点的位置,默认参数为结构元素的几何中心点。

该函数用于生成图像形态学操作中常用的矩形结构元素、十字结构元素和椭圆结构元素。函数第一个参数为生成结构元素的种类,可以选择的参数及含义在表给出,函数第二个参数是结构元素的尺寸大小,能够影响到图像腐蚀的效果,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。函数的最后一个参数是结构元素的中心点,只有十字结构元素的中心点位置会影响图像腐蚀后的轮廓形状,其他种类的结构元素的中心点位置只影响形态学操作结果的平移量.

OpenCV实现图像腐蚀

腐蚀函数

void erode( InputArray src, OutputArray dst, InputArray kernel,                       Point anchor = Point(-1,-1), int iterations = 1,                       int borderType = BORDER_CONSTANT,                       const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
  • kernel:用于腐蚀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
  • anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
  • iterations:腐蚀的次数,默认值为1。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
  • borderValue:使用边界不变外推法时的边界值。

该函数根据结构元素对输入图像进行腐蚀,在腐蚀多通道图像时每个通道独立进行腐蚀运算。 函数的第一个参数为待腐蚀的图像,图像通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。 函数第二个参数为腐蚀后的输出图像,与输入图像具有相同的尺寸和数据类型。 函数第三个和第四个参数都是与结构元素相关的参数,第三个参数为结构元素,第四个参数为结构元素的中心位置,第四个参数的默认值为Point(-1,-1),表示结构元素的几何中心处为结构元素的中心点。 函数第五个参数是使用结构元素腐蚀的次数,腐蚀次数越多效果越明显,参数默认值为1,表示只腐蚀1次。 函数第六个参数是图像像素外推法的选择标志, 第七个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的腐蚀操作没有影响,因此在多数情况下使用默认值即可.

需要注意的是该函数的腐蚀过程只针对图像中的非0像素,因此如果图像是以0像素为背景,那么腐蚀操作后会看到图像中的内容变得更瘦更小;如果图像是以255像素为背景,那么腐蚀操作后会看到图像中的内容变得更粗更大.

简单示例

//// Created by smallflyfly on 2021/6/18.//#include "opencv2/opencv.hpp"#include <iostream>using namespace std;using namespace cv;void drawResult(Mat im, int num, Mat stats, Mat centroids, const string& name) {  for (int i = 1; i < num; ++i) {      int x = centroids.at<double>(i, 0);      int y = centroids.at<double>(i, 1);      cout << x << " " << y << endl;      circle(im, Point(x, y), 2, Scalar(0, 0, 255), -1);      int xmin = stats.at<int>(i, CC_STAT_LEFT);      int ymin = stats.at<int>(i, CC_STAT_TOP);      int w = stats.at<int>(i, CC_STAT_WIDTH);      int h = stats.at<int>(i, CC_STAT_HEIGHT);      Rect rect(xmin, ymin, w, h);      rectangle(im, rect, Scalar(255, 255, 255), 2);      putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.3, Scalar(0, 0, 255), 1);  }  imshow(name, im);}int main() {  Mat src = (              Mat_<uchar>(6, 6) <<                      0, 0, 0, 0, 255, 0,                      0, 255, 255, 255, 255, 255,                      0, 255, 255, 255, 255, 0,                      0, 255, 255, 255, 255, 0,                      0, 255, 255, 255, 255, 0,                      0, 0, 0, 0, 255, 0          );  resize(src, src, Size(0, 0), 50, 50, INTER_NEAREST);  Mat m1, m2;  m1 = getStructuringElement(0, Size(3, 3));  m2 = getStructuringElement(1, Size(3, 3));  Mat erodeM1, erodeM2;  erode(src, erodeM1, m1, Point(-1, -1), 10);  erode(src, erodeM2, m2, Point(-1, -1), 10);  imshow("src", src);  imshow("erodeM1", erodeM1);  imshow("erodeM2", erodeM2);  Mat xbim = imread("xiaobai.jpg");  Mat xbM1, xbM2;  erode(xbim, xbM1, m1, Point(-1, -1), 2);  erode(xbim, xbM2, m2, Point(-1, -1), 2);  imshow("xb", xbim);  imshow("xbM1", xbM1);  imshow("xbM2", xbM2);  Mat im = imread("rice.jfif");  Mat im1 = im.clone();  Mat im2 = im.clone();  Mat im3 = im.clone();  Mat gray;  cvtColor(im, gray, CV_BGR2GRAY);  Mat riceBin;  threshold(gray, riceBin, 125, 255, THRESH_BINARY);  Mat out, stats, centroids;  int count1 = connectedComponentsWithStats(riceBin, out, stats, centroids, 8, CV_16U);  drawResult(im1, count1, stats, centroids, "no erode");  Mat erodeIm1, erodeIm2;  erode(riceBin, erodeIm1, m1, Point(-1, -1), 5);  erode(riceBin, erodeIm2, m2, Point(-1, -1), 5);  int count2 = connectedComponentsWithStats(erodeIm1, out, stats, centroids, 8, CV_16U);  drawResult(erodeIm1, count2, stats, centroids, "erode1");  int count3 = connectedComponentsWithStats(erodeIm2, out, stats, centroids, 8, CV_16U);  drawResult(erodeIm2, count3, stats, centroids, "erode2");  waitKey(0);  destroyAllWindows();}

OpenCV实现图像腐蚀

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://blog.csdn.net/B08370108/article/details/118028678 。

最后此篇关于OpenCV实现图像腐蚀的文章就讲到这里了,如果你想了解更多关于OpenCV实现图像腐蚀的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com