OpenCV: 读取图片中某个点的像素值

读取图片中某个点的像素值

OpenCV: 读取图片中某个点的像素值_第1张图片
RGB图 → \rightarrow 降噪 → \rightarrow Gray图 → \rightarrow 两次降采样 → \rightarrow 边缘检测图
此例子中未降噪
OpenCV: 读取图片中某个点的像素值_第2张图片

注意:
此图来源
OpenCV: 读取图片中某个点的像素值_第3张图片

创建时先列后行

//确定某个像素点
 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;
}

未对下图中的值进行强制类型转换,导致出现终端显示乱码

OpenCV: 读取图片中某个点的像素值_第4张图片


对上面的问题进行处理 (强制类型转换)

OpenCV: 读取图片中某个点的像素值_第5张图片
像素点(16,32)的读取结果(136,122,104)
灰度图中像素点(16,32)的值为118
两次降采样后像素点(4,8)的值为0(黑色)

灰度图

修改像素点(4,8)的值变为255 (白色)

img_cny.at<uchar>(x,y)=255;

两次降采样后的边缘检测图

OpenCV: 读取图片中某个点的像素值_第6张图片

你可能感兴趣的:(学习OpenCV3,opencv,c++,读取像素)