主要包括C++图像的高斯模糊、Canny边缘检测、降采样、读写像素值的实现
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv){
Mat img = imread("F:/test/apple.jpg"); // 定义一个Mat(Matrix)容器用于存储图像
if (img.empty()) return -1;
namedWindow("imgRead", WINDOW_AUTOSIZE); // WINDOW_FREERATIO可手动调节窗口大小
//高斯模糊
Mat out;
GaussianBlur(img, out, Size(5, 5), 3, 3);
imshow("GaussianProcess2", out);
//色彩空间转换
Mat gray, hsv;
cvtColor(out, hsv, COLOR_BGR2HSV);
cvtColor(out, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("GRAY", gray);
//高斯平滑处理后的Canny边缘检测
Mat cny;
Canny(gray, cny, 10, 100, 3, true);
imshow("Canny", cny);
//未经高斯平滑的Canny边缘检测
Mat gray2, cny2;
cvtColor(img, gray2, COLOR_BGR2GRAY);
Canny(gray2, cny2, 10, 100, 3, true);
imshow("Canny2", cny2);
//降采样
Mat down1, down2;
pyrDown(img, down1);
imshow("down1", down1);
pyrDown(down1, down2);
imshow("down2", down2);
//读取指定坐标处的像素值
int x = 16, y = 32;
Vec3b intensity = img.at< Vec3b >(y, x);
uchar blue = intensity[0];
uchar green = intensity[1];
uchar red = intensity[2];
cout << "At (x,y) = (" << x << "," << y << "):(blue, green, red) = (" << (unsigned int)blue << "," << (unsigned int)green << "," << (unsigned int)red << ")" << endl;
Mat gry;
cvtColor(img, gry, COLOR_BGR2GRAY);
cout << "Gray pixel there is:" << (unsigned int)gry.at(y, x) << endl;
x /= 4, y /= 4;
cout << "Pyramid2 pixel there is " << (unsigned int)down2.at(y, x) << endl;
//Set the gray pixel there to 128
gry.at(x, y) = 128;
cout << "Gray reset pixel there is:" << (unsigned int)gry.at(x, y) << endl;
imshow("imgRead", img);
waitKey(0);
destroyAllWindows();
}
高斯模糊函数:GaussianBlur()。5个参数分别为:输入图像、输出图像、高斯核的大小、高斯核函数在X方向的的标准偏差、高斯核函数在Y方向的的标准偏差。
色彩空间转换函数:cvtColor()。3个参数分别为:输入图像、输出图像、色彩空间转换方式。
Canny边缘检测函数:Canny()。6个参数分别为:输入图像(必须是单通道)、输出图像、第一个阈值、第二个阈值、Sobel 算子内核大小,最后一个参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加。而在两个阈值中,第一个阈值用来控制边缘连接,第二个阈值用来控制强边缘的初始分割。
降采样:pyrDown()。每次降采样都使图像的宽高分别缩小一半。
读取像素值部分:
定义一个类型为uchar长度为3的数组,at定位到(y, x)处的像素:
Vec3b intensity = img.at< Vec3b >(y, x);
分别取出对应像素中三个通道的值:
uchar blue = intensity[0]; uchar green = intensity[1]; uchar red = intensity[2];
由于返回的使uchar类型的值,在cout输出时需要强制转换类型:
cout << "At (x,y) = (" << x << "," << y << "):(blue, green, red) = (" << (unsigned int)blue << "," << (unsigned int)green << "," << (unsigned int)red << ")" << endl;
结果图如下:
原图和高斯平滑后对比:
色彩空间转换后:
Canny边缘检测:高斯平滑后的边缘检测对比未经高斯平滑的边缘检测结果
两次降采样:



