算术操作
- 加减乘除
API: add、subtract、multiply、divide
PS: 进行操作的图像大小和类型必须一致
code:
Mat dst1, dst2, dst3, dst4;
add(src1, src2, dst1);
imshow("add-Demo", dst1);
subtract(src1, src2, dst2);
imshow("sub-Demo", dst2);
multiply(src1, src2, dst3);
imshow("mul-Demo", dst3);
divide(src1, src2, dst4);
imshow("div-Demo", dst4);
- 图像亮度和对比度调整
PS: 黑色(0,0,0),白色(255,255,255),对RGB图像来说,亮度越大值越高,因此,通过增加像素值就可以提高亮度,反之减小亮度,而对比度体现的是图像的差异度,需要让图片的像素乘以某个值,增大差异就增大了对比度。
API: addWeighted 详细使用说明
code:
//打开原始图片
Mat src3 = imread("F:/code/images/kobe.jpg",IMREAD_COLOR);
if (src3.empty()) {
cout << "fail to read image" << endl;
return -1;
}
imshow("input3", src3);
//创建与原始图一样大小和类型的空像素图
Mat black = Mat::zeros(Size(src3.size()), src3.type());
//imshow("black", black);
black = Scalar(127,127,127);
//对原始图进行像素操作
Mat dst;
add(src3, black, dst);//给图片加亮
subtract(src3, black,dst);//给图片减亮
//imshow("dst", dst);
Mat dst2;
addWeighted(src3,1.5,black,0.5,0.0,dst2);//增加对比度
addWeighted(src3, 1.5, black, -0.5, 0.0, dst2);
addWeighted(src3, 0.5, black, 0.5, 0.0, dst2);//伪装一下透明度:原始图像素乘以0.5
imshow("dst2", dst2);
位操作
-
位操作有什么好处:速度快,效果好
-
与、或、非、异或 : bitwise_and、bitwise_or、bitwise_not、bitwise_xor
//取反 非
bitwise_not(src4, m1);
imshow("bitwise not", m1);
//与操作
Mat m2;
bitwise_and(src4, src4, m2);
imshow("bitwise and", m2);
//或操作
Mat m3;
bitwise_or(src4, src4, m3);
imshow("bitwise or", m3);
//异或操作
Mat m4;
bitwise_xor(src4, src4, m4);
imshow("bitwise xor", m4);
- 利用带 mask 操作
ps: 通过 mask 设置感兴趣区域(ROI),针对感兴趣区域进行操作,例如提取等。
//设置 mask 设置感兴趣区域 ROI
Mat mask = Mat::zeros(src4.size(), CV_8UC1);
int height = src4.rows / 2;
int width = src4.cols / 2;
for (int row = 0; row < height; row++) {
uchar* curr_row = mask.ptr<uchar>(row);//指针访问
for (int col = 0; col < width; col++) {
//mask.at<uchar>(row, col) = 255;//数组访问
*curr_row++ = 255;
}
}
namedWindow("mask", WINDOW_NORMAL);
resizeWindow("mask", Size(300, 200));
imshow("mask", mask);
//取反 非
bitwise_not(src4, m1,mask);//设置mask 将感兴趣区域取反(非操作)
namedWindow("bitwise not", WINDOW_NORMAL);
resizeWindow("bitwise not", Size(300, 200));
imshow("bitwise not", m1);
//与操作
Mat m2;
bitwise_and(src4, src4, m2,mask);//设置mask将感兴趣区域提取出来(与操作)
namedWindow("bitwise and", WINDOW_NORMAL);
resizeWindow("bitwise and", Size(300, 200));
imshow("bitwise and", m2);
//或操作
Mat m3;
bitwise_or(src4, src4, m3, mask);设置mask将感兴趣区域(或操作)
namedWindow("bitwise or", WINDOW_NORMAL);
resizeWindow("bitwise or", Size(300, 200));
imshow("bitwise or", m3);
//异或操作
Mat m4;
bitwise_xor(src4, src4, m4, mask);设置mask将感兴趣区域(异或操作)
namedWindow("bitwise xor", WINDOW_NORMAL);
resizeWindow("bitwise xor", Size(300, 200));
imshow("bitwise xor", m4);
像素信息统计
- 像素最大值与最小值:minMaxLoc ,此API只支持单通道的图像
求得单通道图像中,像素的最大值和最小值,以及他们分别的像素点位置坐标
double min_val;
double max_val;
Point min_loc;
Point max_loc;
minMaxLoc(img, &min_val, &max_val, &min_loc, &max_loc);//注意,这个 img 要是单通道
printf("min:%.2f,max:%.2f\n", min_val, max_val);
printf("minloc:(%d,%d),maxloc:(%d,%d)\n", min_loc.x, min_loc.y,max_loc.x,max_loc.y);
- 像素均值和方差:mean meanStdDev
Scalar s = mean(img);//获取三通道图像的均值
printf("mean:%.2f,%.2f.%.2f\n", s[0],s[1],s[2]);
Mat mm, mstd;
meanStdDev(img, mm, mstd);//save 3 channels mean and stddev
printf("mm:%.2f,%.2f,%.2f mstd:%.2f,%.2f,%.2f\n", mm.at<double>(0, 0),mm.at<double>(1, 0), mm.at<double>(2, 0),
mstd.at<double>(0, 0), mstd.at<double>(1, 0), mstd.at<double>(2, 0));
- 像素值信息统计:通过遍历像素值做统计
定义一个整型的 vector , 大小为256,因为像素值的大小是:0-255;然后通过遍历图像的像素值,在对应的vector位置上自加,实现统计,后续可以将统计结果通过直方图显示。
//统计灰度图像
vector<int> hist(256);
for (int i = 0; i < 256; i++) {
hist[i] = 0;
}
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int pv = img.at<uchar>(row, col);
hist[pv]++;
}
}