图像像素级操作
- 获取单通道像素值
- int gray_pexls = gray_src.at<uchar>(row, col); //为什么int后边又是uchar呢??????
- 改变单通道图片像素值
- gray_src.at<uchar>(row, col) = 255 - gray_pexls; //黑白互换
- 把CV_8UC1,转换成CV_32F, 32位float数据
- src.convertTo(dst, CV_32F);
- 获取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类型数据
- 利用函数完成上述反差效果
- Mat 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;
}