Opencv3 C ++ VS2017スタディノート03ピクセルレベルのビット演算

画像のピクセルレベルの操作


  • 取得単一チャネルの画素値を、
    •  intgrey_pexls = grey_src.at <uchar>(row、col); // intの後にucharがあるのはなぜですか??????
  • シングルチャンネル画像のピクセル値を 変更する
    • gray_src.at <uchar>(row、col)= 255-gray_pexls; //黒と白の交換
  • CV_8UC1をCV_32F、32ビットフロートデータに変換します
    • src.convertTo(dst、CV_32F);              
  • 取得3チャネルの画素値を、 
    • 明らかに、各ピクセルは[b、g、r]の3次元ベクトルです。
      • int b = dst.at <Vec3b>(row、col)[0]; // Vec3b、vecはテンプレートクラスVecのオブジェクト、3は3チャネル、対応する3つのチャネルはBGRのUchar型データです
      • int g = dst.at <Vec3b>(row、col)[1]; // atは関数であり、<>の関数パラメーターとは異なります。
      • int r = dst.at <Vec3b>(row、col)[2]; // Vec3fは同じfloat型データです
  • この機能を使用して、上記のコントラスト効果完成させます
    • マットdst_f;
    • dst = Mat(src.size()、src.type());
    •  bitwise_not(src、dst_f); //ビット演算。255-rgbと同等
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>

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<uchar>(row, col);			//为什么int后边又是uchar呢??????
			//改变单通道图片像素值
			gray_src.at<uchar>(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<uchar>(row, col);			//为什么int后边又是uchar呢??????
				//改变单通道图片像素值
				gray_src.at<uchar>(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<Vec3b>(row, col)[0];		//Vec3b,vec是模板类Vec的对象,3是3通道,对应三通道是BGR的uchar类型数据
				int g = dst.at<Vec3b>(row, col)[1];		//at是个函数,与之不同函数参数前有<>
				int r = dst.at<Vec3b>(row, col)[2];			//Vec3f是同理的float类型数据
				
				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("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;
}

 

おすすめ

転載: blog.csdn.net/Mrsherlock_/article/details/104490377