OpenCV-图像处理(04、图像操作)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/85803835

读写图像

  • imread 可以指定加载为灰度或者RGB图像
  • Imwrite 保存图像文件,类型由扩展名决定

读写像素

  • 读一个GRAY像素点的像素值(CV_8UC1)
    Scalar intensity = img.at(y, x);
    或者 Scalar intensity = img.at(Point(x, y));

  • 读一个RGB像素点的像素值
    Vec3f intensity = img.at(y, x);
    float blue = intensity.val[0];
    float green = intensity.val[1];
    float red = intensity.val[2];

修改像素值

  • 灰度图像
    img.at(y, x) = 128;

  • 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

  • 空白图像赋值
    img = Scalar(0);

  • ROI选择
    Rect r(10, 10, 100, 100);
    Mat smallImg = img®;

  • Vec3b与Vec3F
    Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
    Vec3f对应三通道的float类型数据
    把CV_8UC1转换到CV32F1实现如下:src.convertTo(dst, CV_32F);

上述代码案例
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace std;
using namespace cv;

int main(int argc,char** argv){
	Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
	if(!src.data){
		cout<<"Could not load Image ..."<<endl;
		return -1;
	}
	imshow("input",src);

	Mat gray_src;
	cvtColor(src,gray_src,CV_RGB2GRAY);//转化成灰度图像
	imshow("gary_src",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 gary=gray_src.at<uchar>(row,col);//读取图像中 row,col 位置的像素(颜色数据由单通道组成),所以<>中用uchar,只返回的是一个uchar值
			gray_src.at<uchar>(row,col)=255-gary;//颜色值取反,255-原来的值。即:越黑的地方越白;越白的地方越黑
		}
	}
	imshow("gary_src_changed",gray_src);

	//多通道图像处理
	Mat dst;
	dst.create(src.size(),src.type());
	height=src.rows;
	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 gary=gray_src.at<uchar>(row,col);
				gray_src.at<uchar>(row,col)=255-gary;
			}else if(nc==3){//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青色
				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;
			}
		}
	}
	imshow("src_changed",dst);
	Mat dst2;
	bitwise_not(src, dst2);//bitwise_not()颜色值取反,同上面算法一致,这个是通过位操作 与或非 实现的
	imshow("src_changed2",dst2);




	//其他操作(处理灰度图像的其他方式)
	Mat dst3,dst4,dst5;
	dst3.create(src.size(),src.type());//初始化图像

	cvtColor(src,dst4,CV_RGB2GRAY);//将其变为单通道图像,否则图像宽度只有原图像的3分之一,也可以写成下面这种方式
	dst5.create(src.size(),CV_8UC1);//或者直接定义成:Mat dst5(src.size(),CV_8UC1);

	height=src.rows;
	width=src.cols;
	nc=src.channels();

	for (int row = 0; row < height; row++){
		for (int col = 0; col < width; col++){
			if(nc==1){
				int gary=gray_src.at<uchar>(row,col);
				gray_src.at<uchar>(row,col)=255-gary;
			}else if(nc==3){//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青色
				int b = src.at<Vec3b>(row,col)[0];
				int g = src.at<Vec3b>(row,col)[1];
				int r = src.at<Vec3b>(row,col)[2];
				dst3.at<Vec3b>(row,col)[0] = b;
				dst3.at<Vec3b>(row,col)[1] = 0;//将 g 的值全部变为0
				dst3.at<Vec3b>(row,col)[2] = r;
				
				dst4.at<uchar>(row,col) = max(r, max(b, g));//随意设置的灰度图,取max图像会比取min亮
				dst5.at<uchar>(row,col) = min(r, min(b, g));
			}
		}
	}

	imshow("change b=0",dst3);
	imshow("gray_src->max(b,g,r)",dst4);
	imshow("gray_src->min(b,g,r)",dst5);





	waitKey(0);

	return 0;
}
运行截图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/85803835