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;
效果见图。