//1.添加必要的头文件; 8:34
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
//2.创建一个Mat对象,并读入附件build.jpg至Mat对象; 8:35
Mat img1;
img1 = imread("build.jpg");
imshow("原图", img1);
//3.利用平均值法公式D = (R + G + B) / 3灰度化图像build.jpg,存储为build_gray.jpg并显示;8:39
Mat img2;
img2.create(img1.size(), 0);
for (int i = 0; i < img1.rows; i++)
{
for (int j = 0; j < img1.cols; j++)
{
img2.at<uchar>(i, j) = (img1.at<Vec3b>(i, j)[0] + img1.at<Vec3b>(i, j)[1] + img1.at<Vec3b>(i, j)[2]) / 3;
}
}
imshow("灰度图", img2);
imwrite("build_gray.jpg", img2);
//4.按照公式y = 1.1x + 60,对图像build_gray.jpg进行线性灰度变换;8:43
Mat img3;
img3 = imread("build_gray.jpg",0);
Mat img4;
img4.create(img3.size(), 0);
for (int i = 0; i < img3.rows; i++)
{
for (int j = 0; j < img3.cols; j++)
{
img4.at<uchar>(i, j) = 1.1*img3.at<uchar>(i, j) + 60;
}
}
imshow("线性灰度变换", img4);
//5.按照公式s = 1.2*log(1 + r),对图像build_gray.jpg进行非线性灰度变换;8:45
Mat img5;
img5.create(img3.size(), 0);
for (int i = 0; i < img3.rows; i++)
{
for (int j = 0; j < img3.cols; j++)
{
img5.at<uchar>(i, j) = 1.2*log(1 + img3.at<uchar>(i, j));
}
}
normalize(img5, img5, 0, 255, NORM_MINMAX);
imshow("非线性灰度变换", img5);
//6.计算图像build_gray.jpg灰度值等于100的像素值个数;
int sum = 0;
for (int i = 0; i < img3.rows; i++)
{
for (int j = 0; j < img3.cols; j++)
{
if (img3.at<uchar>(i, j) == 100);
{
sum++;
}
}
}
cout << "灰度值等于100的像素值个数" << sum << endl;
//7.利用calcHist()函数得到build_gray.jpg灰度直方图并显示;
int bins = 256;
Mat hist;
int hist_size[] = {
bins };
float range[] = {
0,256 };
const float* ranges[] = {
range };
calcHist(&img3, 1, 0, Mat(), hist,1, hist_size, ranges);
double max_l;
minMaxLoc(hist, 0, &max_l);
int s = 2;
int gt = 256;
Mat z = Mat::zeros(gt, s*bins, CV_8UC3);
for (int i = 0; i < bins; i++)
{
float bin_val = hist.at<float>(i);
int zg = cvRound(bin_val*gt / max_l);
rectangle(z, Point(i*s, gt - 1), Point((i + 1)*s - 1, gt - zg), Scalar(255, 255, 255));
}
imshow("直方图", z);
//8.使用函数equalizeHist实现图像build_gray.jpg灰度直方图均衡化并显示;
Mat j(img3.size(), 0);
equalizeHist(img3, j);
imshow("直方图均衡化", j);
//9.用blur函数对图像build.jpg进行滤波操作并显示;8:53
Mat q;
blur(img1, q, Size(3, 3));
imshow("blur", q);
//10.利用高斯滤波对图像build.jpg进行平滑并显示; 8:55
Mat g;
GaussianBlur(img1, g, Size(3, 3), 3, 3);
imshow("高斯滤波", g);
//11.用中值滤波对图像build.jpg进行平滑并显示滤波效果;8:56
Mat m;
medianBlur(img1, m, 3);
imshow("中值滤波", m);
//12.按公式对图像build.jpg进行平移,要求保全build.jpg全部像素; 9:03
Mat pp;
pp = imread("build.jpg");
int x0 = 100;
int y0 = 200;
int r = pp.rows + y0;
int c = pp.cols + x0;
Mat p(r,c, pp.type());
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
int x = j - x0;
int y = i - y0;
if (x >= 0 && y >= 0 && x < c&&y < r)
{
p.at<Vec3b> (i,j)= pp.ptr<Vec3b>(y)[x];
}
}
}
imshow("平移", p);
//13.对图像build.jpg进行角度为30°的中心点旋转,不缩放,打印出旋转矩阵;9:05
Point center(img1.cols / 2, img1.rows / 2);
Mat o = getRotationMatrix2D(center, 30, 1);
cout << "旋转矩阵" <<o<< endl;
//14.实现图像build.jpg的上步规定旋转,并存储显示; 9:06
Mat x;
warpAffine(img1, x, o, x.size());
imshow("旋转矩阵", x);
//15.创建与图像build.jpg(源图像)大小相同的纯色图像(目标图像),颜色值为Scalar(100, 0, 150),并显示; 9:08
Mat v(img1.size(), CV_8UC3, Scalar(100, 0, 150));
imshow("创建", v);
//16.在源图像和目标图像上自定义三对对应点,计算仿射变换;
Point2f src[3];
Point2f dst[3];
src[0] = Point2f(0, 0);
src[1] = Point2f(120, 200);
src[2] = Point2f(130, 400);
dst[0] = Point2f(0, 0);
dst[1] = Point2f(220, 300);
dst[2] = Point2f(230, 500);
Mat r1 = getAffineTransform(src, dst);
//17.实现上步的仿射变换,存储仿射变换后图像为“build.jpg仿射变换.jpg”并显示; 9:12
warpAffine(img1, v, r1, v.size());
imshow("仿射变换", v);
imwrite("build.jpg仿射变换.jpg", v);
//18.对“build.jpg仿射变换.jpg”添加宽度为10个像素边框修饰; 9:16
Mat jj;
jj = imread("build.jpg仿射变换.jpg");
Mat bk;
copyMakeBorder(jj, bk, 10, 10, 10, 10, 0, Scalar(255, 0, 0));
imshow("边框", bk);
//19.把图像build.jpg在x轴方向缩小1 / 2,在y轴方向缩小1 / 3并显示; 9:17
Mat sx;
resize(img1, sx, Size(img1.cols / 2, img1.rows / 2));
imshow("缩小", sx);
waitKey(0);
}
opencv 学习笔记(十二) 第二周总结
猜你喜欢
转载自blog.csdn.net/Lightismore/article/details/123983909
今日推荐
周排行