图像处理---《读写图像、读写像素、修改像素值》
学习:利用读写图像、读写像素、修改像素值,实现一个图像反色处理例子
读写图像
(1)imread 可以指定加载为灰度或者RGB图像。
(2)Imwrite 保存图像文件,类型由扩展名决定。
读写像素
(1)读一个GRAY像素点的像素值(CV_8UC1)
Scalar intensity = img.at<uchar>(y, x);
或者 Scalar intensity = img.at<uchar>(Point(x, y));
(2)读一个RGB像素点的像素值
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
修改像素值
(1)灰度图像
img.at<uchar>(y, x) = 128;
(2)RGB三通道图像
img.at<Vec3b>(y,x)[0]=128; // blue
img.at<Vec3b>(y,x)[1]=128; // green
img.at<Vec3b>(y,x)[2]=128; // red
(3)空白图像赋值
img = Scalar(0);
(4)ROI选择
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);
Vec3b与Vec3F
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst, CV_32F);
/*************************************************************************************** 作者:@WP20190612 环境:VS2010 + OpenCV2.4.3 功能:利用读写图像、读写像素、修改像素值--->实现 自己写一个图像反色处理函数 的例子 ***************************************************************************************/ //-------------------------------功能:自己写一个图像反色处理函数------------------------------ #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main (int argc, char** argv) //argumentss 参数;argc命令行参数个数; { Mat src; src = imread("D:\\003_test_img\\test001.png"); if (src.empty()) { cout << "could not load image ...\n" << endl; return -1; //return 0 成功完成本函数;return -1 未能完成本函数 } namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); //---------------------------开始 进行功能处理--------------------------------------- /*//**************************处理单通道的******************************* Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output",gray_src); //图像的宽、高 int height = gray_src.rows; int width = gray_src.cols; //图像进行反色处理---单通道 for (int row=0; row<height; row++) { for (int col=0; col<width; col++) { int gray=gray_src.at<uchar>(row, col); gray_src.at<uchar>(row, col)=255-gray; } } //显示处理后的图像 namedWindow("gray_invert", CV_WINDOW_AUTOSIZE); imshow("gray_invert", gray_src); //**************************处理单通道的********************************/ //**************************处理多通道************************************ Mat gray_src, dst; dst.create(src.size(), src.type()); int height = src.rows; int width = src.cols; int nc=src.channels(); for (int row=0; row<height; row++) { for(int col=0; col<width; col++) { if (nc==1) { int gray = gray_src.at<uchar>(row, col); gray_src.at<uchar>(row, col)=255-gray; } else if (nc==3) { int b=src.at<Vec3b>(row, col)[0]; int g=src.at<Vec3b>(row, col)[1]; int r=src.at<Vec3b>(row, col)[2]; dst.at<Vec3b>(row, col)[0]=255-b; dst.at<Vec3b>(row, col)[1]=255-g; dst.at<Vec3b>(row, col)[2]=255-r; } } } namedWindow("gray_3channels_invert", CV_WINDOW_AUTOSIZE); imshow("gray_3channels_invert", dst); //****************************处理多通道************************************ //----------------------------结束处理图像--------------------------------------- waitKey(0); //防止DOS一闪而过 return 0; }
/*************************************************************************************** 作者:@WP20190612 环境:VS2010 + OpenCV2.4.3 功能:opencv自带的图像反色处理函数 ***************************************************************************************/ //-------------------------------功能:opencv自带的bitwise_not()反色处理函数------------------------------ #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main (int argc, char** argv) //argumentss 参数;argc命令行参数个数; { Mat src; src = imread("D:\\003_test_img\\test001.png"); if (src.empty()) { cout << "could not load image ...\n" << endl; return -1; //return 0 成功完成本函数;return -1 未能完成本函数 } namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); //---------------------------开始 进行功能处理--------------------------------------- /*//**************************处理单通道的******************************* Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output",gray_src); //图像的宽、高 int height = gray_src.rows; int width = gray_src.cols; //图像进行反色处理---单通道 for (int row=0; row<height; row++) { for (int col=0; col<width; col++) { int gray=gray_src.at<uchar>(row, col); gray_src.at<uchar>(row, col)=255-gray; } } //显示处理后的图像 namedWindow("gray_invert", CV_WINDOW_AUTOSIZE); imshow("gray_invert", gray_src); //**************************处理单通道的********************************/ //**************************处理多通道************************************ Mat gray_src, dst; dst.create(src.size(), src.type()); int height = src.rows; int width = src.cols; int nc=src.channels(); /*for (int row=0; row<height; row++) { for(int col=0; col<width; col++) { if (nc==1) { int gray = gray_src.at<uchar>(row, col); gray_src.at<uchar>(row, col)=255-gray; } else if (nc==3) { int b=src.at<Vec3b>(row, col)[0]; int g=src.at<Vec3b>(row, col)[1]; int r=src.at<Vec3b>(row, col)[2]; dst.at<Vec3b>(row, col)[0]=255-b; dst.at<Vec3b>(row, col)[1]=255-g; dst.at<Vec3b>(row, col)[2]=255-r; } } }*/ //OpenCV自带的颜色 反处理函数 bitwise_not(src, dst); //反位操作函数 namedWindow("gray_3channels_invert", CV_WINDOW_AUTOSIZE); imshow("gray_3channels_invert", dst); //****************************处理多通道************************************ //----------------------------结束处理图像--------------------------------------- waitKey(0); //防止DOS一闪而过 return 0; }