#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src, gray_src;
src = imread("D:/A_Graduation/learning/opencv/tangwei.jpg");
if (!src.data)
{
printf("Could not load image...\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
/*
*读写像素
*读一个GRAY像素点的像素值( CV_8UC1 )
Scalar intensity = img.at<uchar>(y, x);
或者 Scalar intensity = img.at<uchar>(Point(x, y));
*读一个RGB像素点的像素值
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
*Vec3b与Vec3F
Vec3b对应三通道的顺序是blue、green、ren的uchar类型数据
Vec3f对应于三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:src.convertTo(dst, CV_32F);把本来的8Cuchar转换成32位的float数据
*/
//单通道的:
//转换色彩空间,先让它转换成单通道
cvtColor(src, gray_src, CV_BGR2GRAY);
namedWindow("output1", CV_WINDOW_AUTOSIZE);
imshow("output1", gray_src);
int hight = gray_src.rows;
int width = gray_src.cols;
for (int row = 0; row < hight; row++)
{
for (int col = 0; col < width; col++)
{
int gray = gray_src.at<uchar>(row, col); //获取像素值
gray_src.at<uchar>(row, col) = 255 - gray; //写像素值,255-gray 其实效果是反色一下
}
}
namedWindow("output2", CV_WINDOW_AUTOSIZE);
imshow("output2", gray_src);
//三通道
//首先创建一个图像,同样获取它的高和宽,还有获取它的通道值
Mat dst;
dst.create(src.size(), src.type());
hight = src.rows;
width = src.cols;
int nc = src.channels();
for (int row = 0; row < hight; row++)
{
for (int col = 0; col < width; col++)
{
if (nc == 1)
{
int gray = gray_src.at<uchar>(row, col); //获取像素值
gray_src.at<uchar>(row, col) = 255 - gray; //写像素值
}
else if (nc == 3)
{ //读取它的通道值
int b = src.at<Vec3b>(row, col)[0]; //获取像素值,读原图像的,Vec3b是一个新的数据结构,里面就放了BGR的像素,每个像素点有3个字节的就这样读,有几个通道的
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就变成一张反差的那个图像了,这里是对三个通道都进行取反操作
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r; */
dst.at<Vec3b>(row, col)[0] = b; //这里是更炫酷的操作
dst.at<Vec3b>(row, col)[1] = g;
dst.at<Vec3b>(row, col)[2] = 0;
gray_src.at<uchar>(row, col) = max(r, max(g, b)); //用max转灰度图像要亮一些
//gray_src.at<uchar>(row, col) = min(r, min(g, b)); //用min转灰度图像要暗一些
}
}
}
//通过位操作的反位操作也可以获得和上面一样的效果获得三通道图像的反色效果
//反位操作就是把0变成1, 把1变成0, 和上面的255-b是一样的效果
//bitwise_not(src, dst);
namedWindow("output3", CV_WINDOW_AUTOSIZE);
imshow("output3", gray_src);
namedWindow("output4", CV_WINDOW_AUTOSIZE);
imshow("output4", dst);
waitKey(0);
return 0;
}
(04)图像操作--主要是读写像素
最新推荐文章于 2022-01-20 05:52:24 发布