opencv3 学习四 - 图像减色

程序如下

#include "opencv2/opencv.hpp"
using namespace cv;

int main()
{
    // 灰度图
	Mat original = imread("girl.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	Mat modified = imread("girl.jpg",CV_LOAD_IMAGE_GRAYSCALE);

    // 彩色图
	//Mat original = imread("girl.jpg",CV_LOAD_IMAGE_COLOR);
	//Mat modified = imread("girl.jpg",CV_LOAD_IMAGE_COLOR);


	for (int r = 0; r < modified.rows; r++)
	{
		for (int c = 0; c < modified.cols; c++)
		{
            // 灰度图
			modified.at<uchar>(r, c) = modified.at<uchar>(r, c) * 0.6;

            // 彩色图
			//modified.at<Vec3b>(r, c)[0] = modified.at<Vec3b>(r, c)[0] * 0;
            //modified.at<Vec3b>(r, c)[1] = modified.at<Vec3b>(r, c)[1] * 0;
            //modified.at<Vec3b>(r, c)[2] = modified.at<Vec3b>(r, c)[2] * 0;
		}
	}

	imshow("Original", original);
	imshow("Modified", modified);

	waitKey();
	return 0;
}

运行结果如下:

图像减色

通过图像行列,遍历图像的每个像素,通过Mat的成员函数at<>,把每个通道的像素值减少, 但这种方法较慢。

灰度图

灰度图只有一个通道,效果见下图。代码如下:

modified.at<uchar>(r, c) = modified.at<uchar>(r, c) * 0.6;

彩色图

彩色图有三个通道,分别对每个通道减色, 每次只运行下面一条语句, 读取时采用 CV_LOAD_IMAGE_COLOR。程序如下:

modified.at<Vec3b>(r, c)[0] = modified.at<Vec3b>(r, c)[0] * 0;

modified.at<Vec3b>(r, c)[1] = modified.at<Vec3b>(r, c)[1] * 0;

modified.at<Vec3b>(r, c)[2] = modified.at<Vec3b>(r, c)[2] * 0;

效果见图。

posted @ 2018-08-21 14:24  丁丁学习笔记  阅读(543)  评论(0编辑  收藏  举报