Opencv3 C++ VS2017 学习笔记 03像素级位操作

图像像素级操作


  • 获取单通道像素值
    •  int gray_pexls = gray_src.at(row, col);            //为什么int后边又是uchar呢??????
  • 改变单通道图片像素值
    • gray_src.at(row, col) = 255 - gray_pexls;    //黑白互换
  • 把CV_8UC1,转换成CV_32F, 32位float数据
    • src.convertTo(dst, CV_32F);              
  • 获取3通道像素值 
    • 显然每个像素都是[b,g,r]三维向量
      • int b = dst.at(row, col)[0];        //Vec3b,vec是模板类Vec的对象,3是3通道,对应三通道是BGR的uchar类型数据
      • int g = dst.at(row, col)[1];        //at是个函数,与之不同函数参数前有<>
      • int r = dst.at(row, col)[2];         //Vec3f是同理的float类型数据
  • 利用函数完成上述反差效果
    • Mat dst_f;
    • dst = Mat(src.size(), src.type());
    •  bitwise_not(src, dst_f);    //位操作,相当于255-rgb
#include "pch.h"
#include 
#include 

using namespace std;
using namespace cv;

int main(int argc, char ** argv)
{
	Mat src;
	src = imread("C:\\Users\\xujin\\Desktop\\test.JPG");
	if (!src.data)
	{
		cout << "no image";
		return -1;
	}
	/*namedWindow("src_image", WINDOW_AUTOSIZE);
	imshow("src_image", src);
*/
	//RGB转单通道
	Mat gray_src;
	cvtColor(src, gray_src, COLOR_RGB2GRAY);
	namedWindow("gray_src_image", WINDOW_AUTOSIZE);
	imshow("gray_src_image", 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_pexls = gray_src.at(row, col);			//为什么int后边又是uchar呢??????
			//改变单通道图片像素值
			gray_src.at(row, col) = 255 - gray_pexls;    //黑白互换

		}
	}
	namedWindow("gray_src_cvt", WINDOW_AUTOSIZE);			//显示改变像素后的gray图 
	imshow("gray_src_cvt", gray_src);

	//改变三通道图片的像素值
	Mat dst;
	src.copyTo(dst);
	int height3 = src.rows;
	int width3 = src.cols;
	int nc = src.channels();
	for (int row = 0; row < height3; row++)
	{
		for (int col = 0; col < width3; col++)
		{
			if (nc == 1)
			{
				//获取单通道像素值
				int gray_pexls = gray_src.at(row, col);			//为什么int后边又是uchar呢??????
				//改变单通道图片像素值
				gray_src.at(row, col) = 255 - gray_pexls;    //黑白互换
				//src.convertTo(dst, CV_32F);				//把CV_8UC1,转换成CV_32F, 32位float数据
			}
			else
			{
				//获取3通道像素值, 显然每个像素都是[b,g,r]三维向量
				int b = dst.at(row, col)[0];		//Vec3b,vec是模板类Vec的对象,3是3通道,对应三通道是BGR的uchar类型数据
				int g = dst.at(row, col)[1];		//at是个函数,与之不同函数参数前有<>
				int r = dst.at(row, col)[2];			//Vec3f是同理的float类型数据
				
				dst.at(row, col)[0] = 255 - b;
				dst.at(row, col)[1] = 255 - g;
				dst.at(row, col)[2] = 255 - r;
			}
		}

	}
	namedWindow("dst_image", WINDOW_AUTOSIZE);			//显示改变像素后的gray图 
	imshow("dst_image", dst);
	namedWindow("src_image", WINDOW_AUTOSIZE);
	imshow("src_image", src);
	//利用函数完成上述反差效果
	Mat dst_f;
	dst = Mat(src.size(), src.type());
	bitwise_not(src, dst_f);	//位操作,相当于255-rgb
	namedWindow("dst_f_image", WINDOW_AUTOSIZE);
	imshow("dst_f_image",dst_f);


	waitKey(0);
	return 0;
}

 

你可能感兴趣的:(Opencv3 C++ VS2017 学习笔记 03像素级位操作)