0x00.本节课你将学到
0x01.使用OpenCV遍历图片的每个像素
这里其他大佬已经写的很清楚了,我就不再赘述了
0x02.使用OpenCV添加噪点
所谓噪点,就是随机选择一些像素点,修改为其他颜色
代码如下
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat lena;
lena = imread("lena.jpg");
int height = lena.rows, width = lena.cols;
if (lena.isContinuous())
{
width = width * height * lena.channels();
height = 1;
}
for (int i = 0; i < height; ++i)
{
uchar* pix = lena.ptr<uchar>(i);
for (int j = 0; j < width; ++j)
{
if (std::rand() % 100 < 10) //选取10%
{
pix[j] = std::rand() % 256; //修改为随机像素
}
}
}
imshow("lena", lena);
waitKey(0);
return 0;
}
运行结果如下
0x03.使用OpenCV改变图像色调
我们曾经讲过,图片为rgb3通道存储的,如果我们全局增大r的比重,或减少g和b的比重,则图片会偏红,修改图像色调便是此原理,但是注意,在OpenCV中,图像不是RGB而是BGR存储的,因此要注意获取的通道的顺序。
代码如下
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat lena, red;
lena = imread("lena.jpg");
red = lena.clone(); //复制一份到red里
int height = red.rows, width = red.cols;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
//uchar* bc = &red.at<Vec3b>(i, j)[0]; //蓝色通道
//uchar* gc = &red.at<Vec3b>(i, j)[1]; //绿色通道
uchar* rc = &red.at<Vec3b>(i, j)[2]; //红色通道
if (*rc + 100 > 255) //防止uchar越界
*rc = 255;
else
*rc += 100;
}
}
imshow("lena", lena);
imshow("red", red);
waitKey(0);
return 0;
}
结果如下
0x04.使用OpenCV改变图片亮度
当我们等比例增加图片各个通道的值,就可以让图片变亮(实际上是变白),等比例减少就会变暗
变暗的代码如下
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat lena, dark;
lena = imread("lena.jpg");
dark = lena.clone();
int height = dark.rows, width = dark.cols;
if (dark.isContinuous())
{
width = width * height * dark.channels();
height = 1;
}
for (int i = 0; i < height; ++i)
{
uchar* pix = dark.ptr<uchar>(i);
for (int j = 0; j < width; ++j)
{
pix[j] *= 0.5; //每个像素都变成原来的1/2
}
}
imshow("lena", lena);
imshow("dark", dark);
waitKey(0);
return 0;
}
运行结果如下