画像のピクセルレベルの操作
- 取得単一チャネルの画素値を、
- 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型データです
- 明らかに、各ピクセルは[b、g、r]の3次元ベクトルです。
- この機能を使用して、上記のコントラスト効果を完成させます
- マット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;
}