RGB图 → \rightarrow → 降噪 → \rightarrow → Gray图 → \rightarrow → 两次降采样 → \rightarrow → 边缘检测图
此例子中未降噪
创建时先列后行
//确定某个像素点
cv::Vec3b intensity=img_rgb.at<cv::Vec3b>(x,y); //列,行
访问时先行后列
//访问某个像素点
(uint)img_gry.at<uchar>(y,x) //行,列
main.cpp
#include
int main() {
//实例化矩阵
cv::Mat img_rgb,img_gry,img_cny,img_pyr,img_pyr2;
//创建窗口放置灰度图
cv::namedWindow("Example_Gray",cv::WINDOW_AUTOSIZE);
//创建窗口放置边缘检测图
cv::namedWindow("Example_Canny",cv::WINDOW_AUTOSIZE);
//读取图片
img_rgb=cv::imread("/home/.../Projects/CLionProjects/opencv_5/470111.jpg");
//RGB转灰度图
cv::cvtColor(img_rgb,img_gry,cv::COLOR_BGR2GRAY);
//显示灰度图
cv::imshow("Example_Gray",img_gry);
//第一次降采样
cv::pyrDown(img_gry,img_pyr);
//第二次降采样
cv::pyrDown(img_pyr,img_pyr2);
//Canny边缘检测器
cv::Canny(img_pyr2,img_cny,10,100,3,true);
//读写pixel(x:16,y:32)
int x=16,y=32;
//img_rgb.at<>()确定某个像素点
cv::Vec3b intensity=img_rgb.at<cv::Vec3b>(x,y);
//像素点(16,32)的三个通道
uchar blue=intensity[0];
uchar green=intensity[1];
uchar red=intensity[2];
//输出RGB图中像素点At(x,y)=(16,32):(blue,green,red)以及此像素点的三个通道值
std::cout<<"At(x,y)=("<< x << "," << y << "):(blue,green,red)=(" << (uint)blue <<","<< (uint)green <<","<< (uint)red << ")" << std::endl;
//输出灰度图中像素点(16,32)
std::cout<< "Gray pixel there is" << ":"<<(uint)img_gry.at<uchar>(y,x) << std::endl;
//两次降采样后,同一个像素点的坐标变为原坐标的1/4
x /=4, y/=4;
//将边缘检测图中像素点(4,8)设置为255
img_cny.at<uchar>(x,y)=255;
//输出经过图层金字塔降采样后的边缘检测图中像素点(4,8)
std::cout<<"Pyrimaid2 pixel there is" << ":" << (uint)img_cny.at<uchar>(y,x) << std::endl;
//显示边缘检测图
cv::imshow("Example_Canny",img_cny);
//等待键盘事件
cv::waitKey(0); //0或负数,程序会无限等待直到有键盘事件
return 0;
}
未对下图中的值进行强制类型转换,导致出现终端显示乱码
像素点(16,32)的读取结果(136,122,104)
灰度图中像素点(16,32)的值为118
两次降采样后像素点(4,8)的值为0(黑色)
灰度图
修改像素点(4,8)的值变为255 (白色)
img_cny.at<uchar>(x,y)=255;
两次降采样后的边缘检测图