opencv 学习笔记(十二) 第二周总结


//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);
}

猜你喜欢

转载自blog.csdn.net/Lightismore/article/details/123983909
今日推荐