注: 以下代码, 使用 opencv 库函数实现了对图片的翻转, 灰度图转换, 各种滤波, 各种锐化.
库函数相关参数及说明参阅: OpenCV 中文站 =》opencv 教程 (cn)
- #include <iostream>
- #include <stdio.h>
- #include <Windows.h>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
- #include <opencv2/imgproc/types_c.h>
- #include <opencv2/core/core.hpp>
- #include <opencv2/opencv.hpp>
- using namespace std;
- using namespace cv;
- // 全局变量
- const int slider_max = 64;
- int slider;
- Mat img;
- Mat resImg;
- Mat src, res[20];
- // 翻转图片
- void turn(string src)
- {
- Mat srcMat = imread(src);
- if (!srcMat.data)
- {
- cout <<"源图象获取失败!" << endl;
- return;
- }
- // 原始图像
- imshow("原图片", srcMat);
- // 水平翻转
- flip(srcMat, res[0], 1);
- imshow("水平翻转", res[0]);
- imwrite("D:\\trashBox\\testIMG\\flip1.jpg", res[0]);
- // 垂直翻转
- flip(srcMat, res[1], 0);
- imshow("垂直翻转", res[1]);
- imwrite("D:\\trashBox\\testIMG\\flip0.jpg", res[1]);
- }
- // 图像平滑处理 (滤波)
- void blur(string src)
- {
- Mat srcMat = imread(src);
- if (!srcMat.data)
- {
- cout << "源图象获取失败!" << endl;
- return;
- }
- // 源图片
- imshow("源图片", srcMat);
- // 中值滤波
- medianBlur(srcMat, res[4], 5);
- imshow("中值滤波", res[4]);
- imwrite("D:\\trashBox\\testIMG\\medianBlur.jpg", res[4]);
- // 均值滤波
- blur(srcMat, res[5], Size(2, 3), Point(-1, -1));
- imshow("均值滤波", res[5]);
- imwrite("D:\\trashBox\\testIMG\\averBlur.jpg", res[5]);
- // 高斯滤波
- GaussianBlur(srcMat, res[6], Size(3, 3), 0, 0);
- imshow("高斯滤波", res[6]);
- imwrite("D:\\trashBox\\testIMG\\gsBlur.jpeg", res[6]);
- }
- // 图象锐化: 高通滤波
- void sharpen(string src)
- {
- Mat srcMat = imread(src);
- if (!srcMat.data)
- {
- cout << "源图象获取失败!" << endl;
- return;
- }
- // 原图
- imshow("源图片", srcMat);
- // 灰度图
- cvtColor(srcMat, res[3], CV_BGR2GRAY);
- imshow("灰度图象", res[3]);
- imwrite("D:\\trashBox\\testIMG\\grey.jpg", res[3]);
- //sobel 算子, 基于梯度
- Sobel(res[3], res[7], res[3].depth(), 1, 0, 3, 1, 0, BORDER_DEFAULT);
- imshow("X 水平 Sobel", res[7]);
- imwrite("D:\\trashBox\\testIMG\\sobelX.jpg", res[7]);
- Sobel(res[3], res[8], res[3].depth(), 0, 1, 3, 1, 0, BORDER_DEFAULT);
- imshow("Y 方向 Sobel", res[8]);
- imwrite("D:\\trashBox\\testIMG\\sobelY.jpg", res[8]);
- //sobel 叠加
- convertScaleAbs(res[7], res[7]);
- convertScaleAbs(res[8], res[8]);
- addWeighted(res[7], 0.5, res[8], 0.5, 0, res[9]);
- imshow("叠加 Sobel", res[9]);
- imwrite("D:\\trashBox\\testIMG\\sobelXY.jpg", res[9]);
- //laplace 算子, 基于二阶微分
- Laplacian(res[3], res[10], res[3].depth(), 3, 1, 0, BORDER_DEFAULT);
- convertScaleAbs(res[10], res[10]);
- imshow("Laplace 算子边缘检测", res[10]);
- imwrite("D:\\trashBox\\testIMG\\laplace.jpg", res[10]);
- }
- // 直方图
- void hist(string src)
- {
- Mat srcMat = imread(src);
- if (!srcMat.data)
- {
- cout << "源图象获取失败!" << endl;
- return;
- }
- // 直方图均衡化
- cvtColor(srcMat, res[3], CV_BGR2GRAY);// 转灰度图像
- imshow("灰度图", res[3]);
- equalizeHist(res[3], res[11]);
- imshow("直方图均衡化", res[11]);
- imwrite("D:\\trashBox\\equalHist.jpg", res[11]);
- }
- // 颜色减半
- void colorReduce(Mat& input, Mat& output, int div);
- void on_trackbar(int pos, void *);
- // 迭代器实现颜色减半
- void colorReduce(Mat& input, Mat& output, int div)
- {
- output = input.clone();
- Mat_<Vec3b>::iterator it = input.begin<Vec3b>();
- Mat_<Vec3b>::iterator itend = input.end<Vec3b>();
- Mat_<Vec3b> cimage = output;
- Mat_<Vec3b>::iterator itout = cimage.begin();
- Mat_<Vec3b>::iterator itoutend = cimage.end();
- for (; it != itend; it++, itout++)
- {
- for(int i=0; i<3; i++)
- (*itout)[i] = (*it)[i] / div * div + div / 2;//200-249->0-29 压缩灰度级, 用中间值代替
- }
- //output = cimage;
- //imshow("源图片", input);
- //imshow("颜色减半图片", output);
- }
- //trackBar 回调函数
- void on_trackbar(int pos, void *)
- {
- if (pos <= 0)
- {
- resImg = img;
- }
- else
- {
- colorReduce(img, resImg, pos);
- }
- imshow("显示结果", resImg);
- }
- int main()
- {
- //************** 此部分代码调用翻转, 滤波, 锐化函数 *******************//
- //string lena = "D:\\trashBox\\testIMG\\lena.bmp";
- //string tiger = "D:\\trashBox\\testIMG\\tiger.jpg";
- //string xian = "D:\\trashBox\\testIMG\\xian.jpg";
- //turn(lena);
- //blur(tiger);
- //blur(lena);
- //sharpen(xian);
- //sharpen(xian);
- //hist(lena);
- //**************************************************************//
- //******************** 此部分代码实现图象的颜色减半 ******************//
- Mat src, res;
- img = imread("D:\\trashBox\\photo.jpg");
- if (!img.data)
- {
- cout << "源图象获取失败!" << endl;
- return 0;
- }
- namedWindow("原图像");
- namedWindow("显示结果");
- slider = 0;
- createTrackbar("ColorReduce", "显示结果", &slider, slider_max, on_trackbar);
- imshow("原图像", img);
- imshow("显示结果", img);
- waitKey(0);
- }
来源: http://www.bubuko.com/infodetail-3053691.html