OpenCV实现图象翻转、滤波、锐化
OpenCV实现图象翻转、滤波、锐化
注:以下代码,使用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 = ;
int slider;
Mat img;
Mat resImg; Mat src, res[]; //翻转图片
void turn(string src)
{
Mat srcMat = imread(src);
if (!srcMat.data)
{
cout << "源图象获取失败!" << endl;
return;
}
//原始图像
imshow("原图片", srcMat);
//水平翻转
flip(srcMat, res[], );
imshow("水平翻转", res[]);
imwrite("D:\\trashBox\\testIMG\\flip1.jpg", res[]);
//垂直翻转
flip(srcMat, res[], );
imshow("垂直翻转", res[]);
imwrite("D:\\trashBox\\testIMG\\flip0.jpg", res[]);
} //图像平滑处理(滤波)
void blur(string src)
{
Mat srcMat = imread(src);
if (!srcMat.data)
{
cout << "源图象获取失败!" << endl;
return;
}
//源图片
imshow("源图片", srcMat);
//中值滤波
medianBlur(srcMat, res[], );
imshow("中值滤波", res[]);
imwrite("D:\\trashBox\\testIMG\\medianBlur.jpg", res[]);
//均值滤波
blur(srcMat, res[], Size(, ), Point(-, -));
imshow("均值滤波", res[]);
imwrite("D:\\trashBox\\testIMG\\averBlur.jpg", res[]);
//高斯滤波
GaussianBlur(srcMat, res[], Size(, ), , );
imshow("高斯滤波", res[]);
imwrite("D:\\trashBox\\testIMG\\gsBlur.jpeg", res[]);
} //图象锐化:高通滤波
void sharpen(string src)
{
Mat srcMat = imread(src);
if (!srcMat.data)
{
cout << "源图象获取失败!" << endl;
return;
}
//原图
imshow("源图片", srcMat);
//灰度图
cvtColor(srcMat, res[], CV_BGR2GRAY);
imshow("灰度图象", res[]);
imwrite("D:\\trashBox\\testIMG\\grey.jpg", res[]);
//sobel算子,基于梯度
Sobel(res[], res[], res[].depth(), , , , , , BORDER_DEFAULT);
imshow("X水平Sobel", res[]);
imwrite("D:\\trashBox\\testIMG\\sobelX.jpg", res[]);
Sobel(res[], res[], res[].depth(), , , , , , BORDER_DEFAULT);
imshow("Y方向Sobel", res[]);
imwrite("D:\\trashBox\\testIMG\\sobelY.jpg", res[]);
//sobel叠加
convertScaleAbs(res[], res[]);
convertScaleAbs(res[], res[]);
addWeighted(res[], 0.5, res[], 0.5, , res[]);
imshow("叠加Sobel", res[]);
imwrite("D:\\trashBox\\testIMG\\sobelXY.jpg", res[]); //laplace算子, 基于二阶微分
Laplacian(res[], res[], res[].depth(), , , , BORDER_DEFAULT);
convertScaleAbs(res[], res[]);
imshow("Laplace算子边缘检测", res[]);
imwrite("D:\\trashBox\\testIMG\\laplace.jpg", res[]);
} //直方图
void hist(string src)
{
Mat srcMat = imread(src);
if (!srcMat.data)
{
cout << "源图象获取失败!" << endl;
return;
}
//直方图均衡化
cvtColor(srcMat, res[], CV_BGR2GRAY);//转灰度图像
imshow("灰度图", res[]);
equalizeHist(res[], res[]);
imshow("直方图均衡化", res[]);
imwrite("D:\\trashBox\\equalHist.jpg", res[]);
} //颜色减半
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=; i<; i++)
(*itout)[i] = (*it)[i] / div * div + div / ;//200-249->0-29压缩灰度级,用中间值代替
}
//output = cimage;
//imshow("源图片", input);
//imshow("颜色减半图片", output);
} //trackBar 回调函数
void on_trackbar(int pos, void *)
{
if (pos <= )
{
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 ;
}
namedWindow("原图像");
namedWindow("显示结果"); slider = ;
createTrackbar("ColorReduce", "显示结果", &slider, slider_max, on_trackbar); imshow("原图像", img);
imshow("显示结果", img); waitKey();
}
OpenCV实现图象翻转、滤波、锐化的更多相关文章
- 积分图实现均值滤波的CUDA代码
没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波.类似于OpenCV的blur()函数. 使用lena. ...
- 第三节,使用OpenCV 3处理图像(模糊滤波、边缘检测)
一 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机中有三种常用的色彩空间:灰度,BGR以及HSV(Hue,Saturation,Value). 灰度色彩空间 ...
- 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测
1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...
- Python+OpenCV图像处理(七)—— 滤波与模糊操作
过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...
- 【opencv基础】图像翻转cv::flip详解
前言 在opencv中cv::flip函数用于图像翻转和镜像变换. 具体调用形式 void cv::flip( cv::InputArray src, // 输入图像 cv::OutputArray ...
- opencv—读取一张图片并滤波
#include <opencv2\opencv.hpp> #include <iostream> #include <string> using namespac ...
- 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()
7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...
- OpenCV 之 图象几何变换
二维平面中,图像的几何变换有等距.相似.仿射.投影等,如下所示: 1 图象几何变换 1.1 等距变换 等距变换 (Isometric Transformation),是一种二维的刚体变换,可理解为 ...
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...
随机推荐
- IDEA启动tomcat报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component
先看错误日志: -May- ::.M26 -May- :: :: UTC -May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLog ...
- 查看QML数据类型
assist输入: QML Types A Abstract3DSeries AbstractActionInput AbstractAnimation AbstractAxis AbstractAx ...
- 常用SQL50句
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- mysql创建数据库、表、写数据
mysql> create database ceshi; Query OK, 1 row affected (0.01 sec) 给数据库授权,否则程序时无法连接ceshi数据库的,每次创建一 ...
- js实现前端导出大文件Excel
//base64转换成blob function dataURIToBlob(dataURI, callback) { var binStr = atob(dataURI.split(",& ...
- Jenkins增加日志查看内容. 如何查看Jenkins插件的日志?
进入Jenkins日志项 添加新的日志记录 把插件的GroupID信息填入 对应的源代码 日志生成代码 执行插件,即可查看插件里的日志输出
- Ubuntu16.04下KeepAlived+Nginx 布署
前言 网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办 ...
- Composer 笔记
composer 依赖于git而设计的代码仓管理工具 1.可以通过手动配置源,获取代码 "require": { "group/val": "0.0. ...
- 基于 Spring + Atomikos + Mybatis的多数据源配置demo
1.spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- LinkedList的基本用法
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. 博客原文地址链接:http://blog.csdn.net/i_lovefish/article/details ...