4. 图像操作(OpenCV基础课程视频学习)

柔情痞子 提交于 2020-03-08 18:25:16

课程视频:https://www.bilibili.com/video/av29600072?p=5

内容

  • 读写图片
  • 读写像素
  • 修改像素值

1. 读写图像

1.1 imread

可以指定加载为灰度或者 BGR 图像。

1.2 imwrite

保存图像文件,类型由扩展名决定

2. 读写像素 与 修改像素值

2.1 读写一个 GRAY 像素点的像素值 (CV_8UC1)

image .at(y, x);

int main(int argc, char** argv)
{
	cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);

	cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
	cv::imshow("Original Image", image);

	cv::Mat dst;
	cv::cvtColor(image, dst, cv::COLOR_BGR2GRAY);
	
	cv::namedWindow("Gray Image", cv::WINDOW_AUTOSIZE);
	cv::imshow("Gray Image", dst);

	int imageRow = dst.rows;
	int imageCol = dst.cols;

	for (int irow = 0; irow < imageRow; irow++)
	{
		for (int icol = 0; icol < imageCol; icol++)
		{
			int gray = dst.at<uchar>(irow, icol);
			dst.at<uchar>(irow, icol) = 255 - gray;
		}
	}
	cv::imshow("Gray Image Inversion", dst);
	cv::waitKey(0);

	return 0;
}

结果
在这里插入图片描述

2.2 读写一个 BGR 像素点的像素值

2.2.1 方法一

image .at(y,x)

int main(int argc, char** argv)
{
	cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);

	cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
	cv::imshow("Original Image", image);

	// ******************** BGR 图像反转 *********************
	cv::Mat dst;
	dst.create(image.size(), image.type());

	int imageRow = image.rows;
	int imageCol = image.cols;

	for (int irow = 0; irow < imageRow; irow++)
	{
		for (int icol = 0; icol < imageCol; icol++)
		{
			int b = image.at<cv::Vec3b>(irow, icol)[0];
			int g = image.at<cv::Vec3b>(irow, icol)[1];
			int r = image.at<cv::Vec3b>(irow, icol)[2];
			dst.at<cv::Vec3b>(irow, icol)[0] = 255 - b;
			dst.at<cv::Vec3b>(irow, icol)[1] = 255 - g;
			dst.at<cv::Vec3b>(irow, icol)[2] = 255 - r;
		}
	}

	cv::imshow("BGR Inversion", dst);
	cv::waitKey(0);
	
	return 0;
}

结果
在这里插入图片描述

2.2.2 方法二

使用 cv::bitwise_not 操作,即通过位操作实现反转图像。

int main(int argc, char** argv)
{
	cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);

	cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
	cv::imshow("Original Image", image);

	// ******************** BGR 图像反转 *********************
	cv::Mat dst;
	dst.create(image.size(), image.type());

	int imageRow = image.rows;
	int imageCol = image.cols;

	cv::bitwise_not(image, dst);

	cv::imshow("BGR Inversion", dst);
	cv::waitKey(0);
	
	return 0;
}

结果
在这里插入图片描述

2.3 Vec3b 与 Vec3f

  • Vec3b 对应三通道的顺序是 blue、green、red 的 uchar 类型数据。
  • Vec3f 对应三通道的 float 类型数据
  • 把 CV_8UC1 转换到 CV32F1 实现如下:
image.convertTo(dst, CV_32F);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!