OpenCv3编程学习九

    技术2023-05-27  70

    1.漫水填充

    作用就是用一种特定的颜色填充通道区域,经常用来标记或者分离图像的一部分。 也就是自动选中了和种子点相连的区域,再将该区域替换成指定的颜色。 floodFile函数(): 第一个参数是image,第二个参数是标识操作掩模,第三个参数是漫水填充算法的起始点,第四个参数是Scalar,也就是像素点被染色的值,第五个是函数需要重绘区域的最小边界矩形区域,第六个是loDiff,表示当前观察像素值和其部件领域像素值或者加入该部件的种子像素之间的亮度,第七个是类似于第六个,第八个参数是操作标志符。

    #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat src = imread("1.jpg"); imshow("[原始图]", src); Rect ccomp; floodFill(src, Point(50, 300), Scalar(155, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20)); imshow("[效果图]", src); waitKey(0); return 0; }

    2.图像金字塔和图片尺寸缩放

    也就是从一种尺寸转换到另一个尺寸,需要放大或者缩小图片的尺寸 包含了三种函数:1.resize()函数 2.pyrUp()和pyrDoown()函数 1.图像金字塔 也就是把图像当成金字塔的话,层级越高,图像越小且分辨率越低。 有两种金字塔类型,一种是高斯金字塔,一种是拉普拉斯金字塔。高斯金字塔式用来向下降采样图像,而拉普拉斯则是用来从金字塔底层图像中向上采样,重建一个图像。 2.高斯金字塔 1.1对图像向下取样 可以是对图像的上一层级进行高斯内核卷积,也可以是对所有偶数行和列去除,这样会得到一个四分之一的图像 1.2图像向下取样 可以是将图像在每个方向扩大原来的两倍,新增的行列用0填充,也可以使用先前一样的内核和放大后的图像卷积,获得新增像素的近似值。 3.拉普拉斯金字塔 它是原图像减去先缩小后再放大的图像的一系列图像构成的。 4.resize()函数 是用来将图像精确转换为指定尺寸的目标图像,并且结合了之前的ROI,resize会对原图像中ROI区域进行调整图像尺寸的操作,来输出到目标图像中。它的参数包含,输入和输出图像,输入图像的大小和两个沿着水平轴和垂直轴的缩放系数。最后一个系数是指定插值方式,可以是线性插值,最近邻插值等等方式

    #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main() { Mat srcImage = imread("1.jpg"); Mat tmpImage, dstImage1, dstImage2;//对于一些图像的定义 tmpImage = srcImage;//把原始图赋给临时变量 imshow("[原始图]", srcImage); //再进行尺寸的调整 resize(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3); resize(tmpImage, dstImage2, Size(tmpImage.cols * 2, tmpImage.rows * 2), (0, 0), (0, 0), 3); //再进行展示 imshow("[效果图]之一", dstImage1); imshow("[效果图]之二", dstImage2); waitKey(0); return 0; }

    pryUp()函数: 就是向上采样并模糊一张图像,也就是等于放大一张图像 参数分别是输入和输出图像,还有输出图像的大小和一个默认基本上不用管的参数。

    #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main() { Mat srcImage = imread("1.jpg"); Mat tmpImage, dstImage1;//对于一些图像的定义 tmpImage = srcImage;//把原始图赋给临时变量 imshow("[原始图]", srcImage); //进行向上取样操作 pyrUp(tmpImage, dstImage1, Size(tmpImage.cols * 2, tmpImage.rows * 2)); //再进行展示 imshow("[效果图]", dstImage1); waitKey(0); return 0; }

    pyrDown()函数 这个函数刚好和之前的相反,是向下采样并且模糊一张图像,也就是缩小图片。

    #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main() { Mat srcImage = imread("1.jpg"); Mat tmpImage, dstImage1;//对于一些图像的定义 tmpImage = srcImage;//把原始图赋给临时变量 imshow("[原始图]", srcImage); //进行向上取样操作 pyrDown(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2)); //再进行展示 imshow("[效果图]", dstImage1); waitKey(0); return 0; }

    阈值化

    就是要从图像中的像素进行筛选,把一些低于或者高于一定值的像素进行剔除,而阈值是最简单的图像分割方法。基本思想就是:给定一个数组和一个阈值,然后根据数组中的每个元素的值是高于还是低于阈值来进行一些处理,主要有Threshold()函数和adaptiveThreshold()函数。 1.Threshold()函数:

    #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<iostream> using namespace cv; using namespace std; #define WINDOW_NAME "[程序窗口]" int g_nThresholdValue = 100; int g_nThresholdType = 3; Mat g_srcImage, g_grayImage, g_dstImage; static void ShowHelpText();//这个数输入帮助文字 void on_Threshold(int, void *);//回调函数 int main() { g_srcImage = imread("1.jpg"); if (!g_srcImage.data) { printf_s("读完图片错误,请重新确认"); return false; } //留存一份原图的灰度图 cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY); //创建窗口并且显示原始图 namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE); //创建滑动条来控制阈值 createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold); createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold); //初始化自定义的阈值回调函数 on_Threshold(0, 0); //再等待用户按键,如果是esc键按下就直接退出程序 while (1) { int key; key = waitKey(20); if ((char)key == 27) { break; } } } //再写on_Threshold函数 void on_Threshold(int,void*) { //调用阈值函数 threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType); //每调用一次 就更新一次效果图 imshow(WINDOW_NAME, g_dstImage); }
    Processed: 0.013, SQL: 9