单通道(灰度)/三通道(RGB)图像应用(侵删)
- 单通道(灰度)
1-1 原图
1-2 灰度图像
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src, gray_src;
src = imread("C:/Users/Administrator/Pictures/20160711084909.jpg");
if (!src.data)
{
printf("could not lead image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
cvtColor(src, gray_src, CV_BGR2GRAY);
namedWindow("output image", CV_WINDOW_AUTOSIZE);
imshow("output image", gray_src);
反转:
int height = gray_src.rows;
int width = gray_src.cols;
for (int row = 0; row<height;row++)
for (int col = 0; col < width; col++)
{
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;
}
imshow("output2", gray_src);
1-3 反正灰度图
需要注意此方法必须要求图片是单通道(即转成灰度图像)才能实现反转。
- 三通道(BGR)图片
Mat dst;
dst.create(src.size(), src.type());
height = src.rows;
width = src.cols;
int nc = src.channels();
for (int row = 0; row<height; row++)
for (int col = 0; col < width; col++)
{
if (nc == 1) {
int gray = gray_src.at<uchar>(row, col);
dst.at<uchar>(row, col) = 255 - gray;
}
else if (nc == 3)
{
int b = dst.at<Vec3b>(row, col)[0];
int g = dst.at<Vec3b>(row, col)[1];
int r = dst.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
}
}
printf("nc = %d", nc);
//bitwise_not(src, dst); //位操作直接反转
imshow("output3", dst);
暂时因为未知原因未实现,但是使用opencv的库函数bitwise_not()可以实现反转,如下图。
1-4 原图像反转
图像混合
API:理解为函数/接口
线性混合:理解为两张图片叠加
f0理解为第一张图像,f1理解为第二张图像,gx理解为合成后的图像
gamma为校验值,如果两个图片混合后太暗了,gamma可以调节亮度。
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int agrc, char** argv) {
Mat src1, src2, dst;
src1 = imread("C:/Users/Administrator/Pictures/mmexport1566896832907.jpg");
src2 = imread("C:/Users/Administrator/Pictures/20190827161326_ps.jpg");
if (src1.empty())
{
cout << "could not load image src1..." << endl;
return -1;
}
if (src2.empty())
{
cout << "could not load image src2..." << endl;
return -1;
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
{
addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
namedWindow("input1", CV_WINDOW_AUTOSIZE);
imshow("input1", src1);
namedWindow("input2", CV_WINDOW_AUTOSIZE);
imshow("input2", src2);
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
}
else printf("could not blend images, the size of images is not same...\n");
waitKey(0);
return 0;
}
2-1 效果图
关于
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
要求两张图必须像素一致且都是同一个格式。
附PS调图片像素方法:
2-2 PS调图片像素方法
另外还有两个API:
add(src1, src2, dst, Mat());
multiply(src1, src2, dst, 1.0);
都是直接的叠加,很不美观。