图像处理---《获取图像的像素指针、像素范围的处理、掩膜应用》

匿名 (未验证) 提交于 2019-12-02 23:43:01

图像处理---《图片的掩膜处理-->提高图像的亮度》

  学习:针对一张图片,(1)如何获取图像的像素指针、(2)像素范围的处理、(3)掩膜应用

/*************************************************************************************** 作者:@WP20190612环境:VS2010 + OpenCV2.4.3 功能:掩膜操作---提高图像的对比度 说明:     知识1:获取图像的像素指针     CV_Assert(myImage.depth()==CV_8U);     Mat.ptr<uchar>(int i=0);     获取像素矩阵的指针,索引i表示第几行,从0开始计数     const uchar* current=myImage.ptr<uchar>(row);    获取当前行的指针     p(row, col)=current[col];     获取当前像素点p(row, col)的像素值     要点---要明确哪个像素指针可以调整,哪里不可以调整      知识点2:     像素范围的处理 saturate_cast<uchar>, 确保RGB值 范围在0~255之间。     saturate_cast<uchar>(-100) 返回0;     saturate_cast<uchar>(288) 返回255;     saturate_cast<uchar>(100) 返回100;      知识点3:     掩膜操作---提高图像的对比度 ***************************************************************************************/  //-------------------------------功能:自己写函数 实现 图像的掩膜操作-------------------- #include <opencv2/opencv.hpp> #include <iostream> #include <math.h>  using namespace cv;  int main (int argc, char** argv)  //argumentss 参数;argc命令行参数个数; {     Mat src, dst;     src = imread("D:\\work_VS2010\\example_opencv\\test001.png");     if (!src.data)     {         printf("could not load image ...\n");         return -1;   //return 0 成功完成本函数;return -1 未能完成本函数     }     namedWindow("input image", CV_WINDOW_AUTOSIZE);     imshow("input image", src);          //----------------------------开始处理图像---------------------------------------     //int cols = src.cols;                     // 单通道     int cols    = (src.cols-1)*src.channels();  // 多通道图像的行数---图像的宽度     int offsetX = src.channels();               // 通道数     int rows    = src.rows;          dst = Mat::zeros(src.size(), src.type());   // 初始化一个与原图像矩阵大小一致的0矩阵,用于存放处理后的图像     //开始掩膜函数处理     for (int row=1; row<(rows-1); row++)     {         //获取像素的位置指针         const uchar* current =src.ptr<uchar>(row);    //当前像素的位置指针         const uchar* previous=src.ptr<uchar>(row-1);  //当前像素之前一个像素的位置指针         const uchar* next    =src.ptr<uchar>(row+1);  //当前像素之后一个像素的位置指针                  uchar* output = dst.ptr<uchar>(row);         for(int col=offsetX; col<cols; col++)             {             //output[col]=5*current[col]-(current[col-offsetX] + current[col+offsetX] + previous[col] + next[col]); //毛刺效果             output[col]=saturate_cast<uchar>(5*current[col]-(current[col-offsetX] + current[col+offsetX] + previous[col] + next[col]) );//无毛刺,提亮的效果         }          }     namedWindow("the image after mask", CV_WINDOW_AUTOSIZE );     imshow("the image after mask",dst);      //保存图像     imwrite("D:\\work_VS2010\\example_opencv\\test001_result.png", dst);          //----------------------------结束处理图像---------------------------------------          waitKey(0);     return 0; }

/*************************************************************************************** 作者:@WP20190612 功能:掩膜操作---提高图像的对比度 说明:     借用OpenCV中的API---filter2D() 掩膜函数进行 ***************************************************************************************/  //-------------------------------功能:filter2D() 进行掩膜处理-------------------- #include <opencv2/opencv.hpp> #include <iostream> #include <math.h>  using namespace cv;  int main (int argc, char** argv)  //argumentss 参数;argc命令行参数个数; {     Mat src, dst;     src = imread("D:\\work_VS2010\\example_opencv\\test001.png");     if (!src.data)     {         printf("could not load image ...\n");         return -1;   //return 0 成功完成本函数;return -1 未能完成本函数     }     namedWindow("input image", CV_WINDOW_AUTOSIZE);     imshow("input image", src);          //----------------------------开始处理图像---------------------------------------     //使用filter2D() 掩膜函数     Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);     filter2D(src, dst, src.depth(), kernel);      namedWindow("the image after mask", CV_WINDOW_AUTOSIZE );     imshow("the image after mask",dst);      //保存图像     imwrite("D:\\work_VS2010\\example_opencv\\test001_result.png", dst);          //----------------------------结束处理图像---------------------------------------          waitKey(0);     return 0; }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!