opencv学习笔记(五)读写像素、修改像素值

 

 

 

1.相关API理解

读一个GRAY像素点的像素值:int intensity = img.at<uchar>(y, x); 或者 int intensity = img.at<uchar>(Point(x, y));

其中y,x分别针对图像的row与col。

Vec3b与Vec3F解释:Vec3b对应三通道的顺序是bluegreenreduchar类型数据。Vec3f对应三通道的float类型数据。

CV_8UC1转换到CV32F1实现是:src.convertTo(dst, CV_32F);

读一个RGB像素点的像素值:

Vec3f intensity = img.at<Vec3f>(y, x);

float blue = intensity.val[0];

float green = intensity.val[1];

float red = intensity.val[2];

反差处理API:bitwise_not(src, dst);第一个参数为输入图像,第二个为输出图像

2.代码实现

灰度图像像素读取修改:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("D:/demo.jpg");
	Mat graySrc;
	if (src.empty()) {
		cout << "文件打开失败" << endl;
		return -1;
	}
	imshow("显示图像", src);
	//单通道像素读取
	cvtColor(src, graySrc, CV_BGR2GRAY);//将src的灰度图像赋给graySrc
	imshow("灰度图像", graySrc);
	int height = graySrc.rows;
	int width = graySrc.cols;
	for(int row=0;row<height;row++)
	{
		for (int col = 0; col < width; col++)
		{
			int gray = graySrc.at<uchar>(row, col);//获取像素值
			graySrc.at<uchar>(row, col)=255-gray;//改变像素值,反差处理
		}
	}
	imshow("改变后图像",graySrc);
	waitKey(0);
	return 0;
}

RGB图像像素读取修改:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;

int main()
{
    Mat src = imread("D:/demo.jpg");
	Mat graySrc;
	if (src.empty()) {
		cout << "文件打开失败" << endl;
		return -1;
	}
	imshow("显示图像", src);

//使用Vec3f,将像素转化为三通道float值
	Mat dest,srcF;
	dest.create(src.size(), src.type());//也可写作dest.create(src.rows, src.cols,CV_8UC3);	
	int height = src.rows;
	int width = src.cols;
	src.convertTo(srcF, CV_32F);
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			Vec3f intensity = srcF.at<Vec3f>(row,col);
			float blue = intensity.val[0];//B通道
			float green = intensity.val[1];//G通道
			float red = intensity.val[2];//R通道
			dest.at<Vec3b>(row, col)[0] = 255 - blue;
			dest.at<Vec3b>(row, col)[1] = 255 - green;
			dest.at<Vec3b>(row, col)[2] = 255 - red;
		}
	}
	imshow("个人实现输出图像", dest);
	
	//直接使用封装的方法进行反差处理
	Mat dest1;
	dest1.create(src.size(), src.type());
	bitwise_not(src, dest1);
	imshow("API输出图像", dest1);

	waitKey(0);
	return 0;
}

结果如下:

效果是一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值