调整图像亮度与对比度
alpha提高对比度
beta提高亮度
(根据公式理解)
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int agrc, char** argv)
{
Mat src, dst;
src = imread("C:/Users/Administrator/Pictures/20160711084909.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_win[] = "input image";
//cvtColor(src, src, CV_BGR2GRAY);
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
//contrast and brightness changes
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.5;
float beta = 10;
//Mat m1;
//src.convertTo(m1, CV_32F);
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (src.channels() == 3)
{
float b = src.at<Vec3b>(row, col)[0];
float g = src.at<Vec3b>(row, col)[1];
float r = src.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if(src.channels() == 1)
{
float v = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
char output_title[] = "contrast and brightness change demo";
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(output_title, dst);
waitKey(0);
return 0;
}
其中:
cvtColor(src, src, CV_BGR2GRAY);
是将图像转化成灰度图像,变成一通道。
//Mat m1;
//src.convertTo(m1, CV_32F);
是对图像从8UC转化成32F,之后就可以用float b = src.at<Vec3c’f>(row, col)[]
图1-1 效果图
单通道也可行,取消注释后:
图1-2 效果图
绘制形状和文字
向量Scalar只能声明0-4个变量,分别是RGB三种颜色和alpha通道。
- 线
void MyLines()
{
Point p1 = Point(20, 30);
Point p2;
p2.x = 300;
p2.y = 300;
Scalar color = Scalar(0, 0, 255);
line(bgImage, p1, p2, color, 1, LINE_8);
}
其中:p1是起始点,p2是截止点,color是图像(线)颜色,B = 0,G = 0, R = 255,显然是红色。
line(背景图片参数,起始点,截止点,颜色,线宽,线类型(抗锯齿啊什么的,默认是LINE_8));
效果如下:
图2-1 绘线图
- 矩形
void MyRectangle()
{
Rect rect = Rect(120, 60, 300, 300);//起始点x,起始点y,矩形宽,矩形高
Scalar color = Scalar(255, 0, 0);
rectangle(bgImage, rect, color, 2, LINE_8);
}
其中Rect(起始点x,起始点y,矩形宽,矩形高);
color还是颜色
rectangle(背景图,矩形,颜色,线宽,线类型);
效果如下:
图2-2 绘矩形图
- 椭圆
void MyEllipse()
{
Scalar color = Scalar(0, 255, 0);
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 360, color, 2, LINE_8);
}
其中:ellipse(背景图,中心点,长短轴,椭圆倾斜度,弧起始和结束(0-360就是一个整椭圆),颜色,线宽,线类型);
效果如下:
图2-3 绘椭圆图
- 圆
void MyCircle()
{
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 100, color, 2, LINE_8);
}
效果如图:
图2-4 绘圆图
- 多边形
void MyPolygon()
{
Scalar color = Scalar(255, 255, 0);
Point pts[1][5];//需要二维的
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = {pts[0]};
int npt[] = { 5 };
fillPoly(bgImage, ppts, npt, 1, color, 8);
}
其中:fillPoly(背景图,折线顶点二维数组,多边形的顶点数,是否是闭合折线(bool类型),颜色,LINE_8);
效果如下:
图2-5 绘多边形图
文字
putText(bgImage, "Hello Opencv!", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(255, 12, 255), 1, 8);
其中:putText(背景,文本,左上角坐标, 字体, 字体大小, 颜色, 字体粗细, 是否抗锯齿);
效果如下:
图2-6 文字图
随机画线
void RandomLineDemo()
{
RNG rng(12345);
Point pt1;
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
namedWindow("randowlinedemo", CV_WINDOW_AUTOSIZE);
for (int i = 0; i < 10000; i++) {
pt1.x = rng.uniform(0, bgImage.cols);
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0)
{
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("randowlinedemo", bg);
}
}`
其中:RNG rng(12345)是定义随机数;
rng.uniform(a, b) 就是a到b中随机生存一个数。
效果如下:
图2-7 随机画线图