OpenCV学习四:图片像素的读、写、修改

特别注意:图片读写的双循环一定是要先写 row ,再写 col ,否则报错!

#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat img = imread("123.jpg",-1);//3通道
	Mat gray = imread("123.jpg",0);//单通道
	Mat test1 = Mat::zeros(img.size(),img.type());
	Mat test2 = Mat::zeros(gray.size(),gray.type());

	////////////////// at //////////////////////////////////////////////////////////

	for (int i=0;i<img.rows;i++)
	{
		for (int j=0;j<img.cols;j++)
		{
			test1.at<Vec3b>(i,j)[0] = 255 - img.at<Vec3b>(i, j)[0];
			test1.at<Vec3b>(i,j)[1] = 255 - img.at<Vec3b>(i, j)[1];
			test1.at<Vec3b>(i,j)[2] = 255 - img.at<Vec3b>(i, j)[2];
		}
	}
	imshow("1",test1);
	imwrite("img1.jpg",test1);


	for (int i=0;i<gray.rows;i++)
	{
		for (int j=0;j<gray.cols;j++)
		{
			test2.at<uchar>(i,j) = 255 - gray.at<uchar>(i, j);
		}
	}
	imshow("2",test2);
	imwrite("gray1.jpg",test2);


	////////////////// 迭代器 //////////////////////////////////////////////////////////

	MatIterator_<Vec3b> ite1;
	for(ite1 = test1.begin<Vec3b>();ite1<test1.end<Vec3b>();ite1++)
	{
		(*ite1)[0] = 255 - (*ite1)[2];//这里为了看出效果做了通道交叉的处理
		(*ite1)[1] = 255 - (*ite1)[1];
		(*ite1)[2] = 255 - (*ite1)[0];
	}
	imshow("3",test1);
	imwrite("img2.jpg",test1);


	MatIterator_<uchar> ite2;
	for (ite2 = test2.begin<uchar>();ite2<test2.end<uchar>();ite2++)
	{
		*ite2 = saturate_cast<uchar>(200-*ite2);
	}
	imshow("4",test2);
	imwrite("gray2.jpg",test2);


	////////////////// 指针 //////////////////////////////////////////////////////////
	//写法1
	for (int i=0;i<img.rows;i++)
	{
		Vec3b *p = test1.ptr<Vec3b>(i);
		for (int j=0;j<img.cols;j++)
		{
			p[j][0] = saturate_cast<uchar>(150-p[j][0]);
			p[j][1] = saturate_cast<uchar>(150-p[j][1]);
			p[j][2] = saturate_cast<uchar>(150-p[j][2]);
		}
	}
	imshow("5",test1);
	imwrite("img31.jpg",test1);
	//写法2
	for(int i=0;i<test1.rows;i++)
	{
		uchar * P = test1.ptr<uchar>(i);

		for(int j=0;j<test1.cols*test1.channels();j++)
		{
			P[j] = saturate_cast<uchar>(300-P[j]);
		}
	}
	imshow("52",test1);
	imwrite("img32.jpg",test1);


	for (int i=0;i<test2.rows;i++)
	{
		uchar * p2 = test2.ptr<uchar>(i);
		for (int j=0; j<test2.cols; j++)
		{
			p2[j] = saturate_cast<uchar>(300-p2[j]);
		}
	}
	imshow("6",test2);
	imwrite("gray3.jpg",test2);

	waitKey();
	return 1;
}

123.jpg

img1.jpg


gray1.jpg


img2.jpg


gray2.jpg


img31.jpg


img32.jpg


gray3.jpg



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值