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

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

  学习:针对一张图片,(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 ... "); 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 ... "); 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; }

 

原文地址:https://www.cnblogs.com/carle-09/p/11027863.html