主要包含了图像的像素加法,当像素增加,会使得图像变亮,当像素减少会使得图像变暗。除法操作会变暗,结果如下所示:
左边是原图,右边是像素相加后的。
在前面的代码模块中增加的代码为:
void QuickDemo::pixel_operators_demo(Mat &image){
Mat dst;
dst = image + Scalar(50, 50, 50);
imshow("像素加法操作", dst);
}
通过滚动进度条调节图像的亮度,代码如下所示:
Mat src,dst, m;
int lightness = 50;
static void on_track(int, void*) {
m = Scalar(lightness, lightness, lightness);
add(src, m, dst);
imshow("亮度调整",dst);
}
void QuickDemo::tracking_bar_demo(Mat &image) {
//创建一个窗口进行亮度调节
namedWindow("亮度调节", WINDOW_AUTOSIZE);
dst = Mat::zeros(image.size(), image.type());
m = Mat::zeros(image.size(), image.type());
int max_value = 100;
//在窗口上创建createTrackbar函数
createTrackbar("Value Bar:", "亮度调节", &lightness, max_value, on_track);
on_track(50, 0);
}
void QuickDemo::bitwise_demo(Mat& image) {
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
//对于m1图像画矩形,左上角的坐标是(100,100),矩形的大小是(80*80),矩形的颜色scalar是(255,255,0)
//thickness参数大于0表示绘制矩形,小于0表示填充矩形
rectangle(m1, Rect(100, 100, 80, 80), Scalar(255,255,0),-1, LINE_8, 0);
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
imshow("m1", m1);
imshow("m2", m2);
}
结果如下所示:
//主要完成通道分离与通道合并
void QuickDemo::channels_demo(Mat &image) {
//由于有多个通道,所以用集合容器,把多个通道放进容器
std::vector mv;
split(image, mv);
imshow("蓝色", mv[0]);
imshow("绿色", mv[1]);
imshow("红色", mv[2]);
}
上图分别是原图,蓝绿红。有的人说这不都是灰色图吗?其实不然。如果我们要是想彰显每个通道的颜色,只需要把其他通道设置为0,那么只剩下你想要彰显的通道颜色,如下所示,可以把函数增加如下几行代码:
void QuickDemo::channels_demo(Mat &image) {
//由于有多个通道,所以用集合容器,把多个通道放进容器
std::vector mv;
split(image, mv);
imshow("蓝色", mv[0]);
imshow("绿色", mv[1]);
imshow("红色", mv[2]);
Mat dst;
mv[1] = 0;
mv[2] = 0;
merge(mv, dst);
imshow("蓝色", dst);
}
其他通道的就不再赘述。
void QuickDemo::inrange_demo(Mat& image) {
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask;
//inRange()函数OpenCV中的inRange()函数可实现二值化功能,更关键的是可以同时针对多通道进行操作,使用起来非常方便!
//主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
//第一个Scalar是绿色hsv三个参数的最小值,第二个是最大值,可以把背景为绿色的去掉,转化为二值化图像
inRange(hsv, Scalar(35,43,46), Scalar(77,255,255), mask);
imshow("mask", mask);
}
(1) 对于灰度图单通道的图像可以如下这么做进行统计,但是对于彩色图不行。
void QuickDemo::pixel_statistic_demo(Mat& image) {
double minv, maxv;
Point minLoc, maxLoc;
minMaxLoc(image, &minv, &maxv, &minLoc, &maxLoc, Mat());
std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
//求取均值和方差
Mat mean, stddev;
meanStdDev(image, mean, stddev);
std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}
(2)对于彩色图三通道做法如下:需要分别统计每一个通道的像素均值和方差,代码如下:
void QuickDemo::pixel_statistic_demo(Mat& image) {
double minv, maxv;
Point minLoc, maxLoc;
std::vector mv;
split(image, mv);
for (int i = 0; i < mv.size(); i++) {
minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
}
//求取均值和方差
Mat mean, stddev;
meanStdDev(image, mean, stddev);
std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}
结果如下所示:
void QuickDemo::drawing_demo(Mat& image) {
Rect rect;
rect.x = 200;
rect.y = 200;
rect.width = 100;
rect.height = 100;
rectangle(image, rect, Scalar(0, 0, 255),2, 8, 0);
imshow("绘制演示", image);
}