专栏首页FPGA开源工作室Ubuntu Opencv 图像平滑处理

Ubuntu Opencv 图像平滑处理

Ubuntu Opencv 图像平滑处理

1背景知识

平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 ( g(i,j)) 是输入像素值 (f(i+k,j+l))的加权和 :

称为 核, 它仅仅是一个加权系数。不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。

1.1 均值滤波器

最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等),核如下:

1.2 高斯滤波器

高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。

假设图像是1维的,那么观察上图,不难发现中间像素的加权系数是最大的, 周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小。

1.3 中值滤波器

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。

1.4 双边滤波器

目前我们了解的滤波器都是为了 平滑 图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。

2 Opencv 实现

第一步:编写C++源程序.

#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"

using namespace std;using namespace cv;

/// 全局变量int DELAY_CAPTION = 1500;int DELAY_BLUR = 100;int MAX_KERNEL_LENGTH = 31;

Mat src; Mat dst;char window_name[] = "Filter Demo 1";

/// 函数申明int display_caption( char* caption );int display_dst( int delay );

/** * main 函数 */

int main( int argc, char** argv )

{

namedWindow( window_name, CV_WINDOW_AUTOSIZE );

/// 载入原图像

src = imread( "../images/lena.jpg", 1 );

if( display_caption( "Original Image" ) != 0 ) { return 0; }

dst = src.clone();

if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }

/// 使用 均值平滑

if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }

for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )

{ blur( src, dst, Size( i, i ), Point(-1,-1) );

if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

/// 使用高斯平滑

if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }

for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )

{ GaussianBlur( src, dst, Size( i, i ), 0, 0 );

if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

/// 使用中值平滑

if( display_caption( "Median Blur" ) != 0 ) { return 0; }

for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )

{ medianBlur ( src, dst, i );

if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

/// 使用双边平滑

if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }

for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )

{ bilateralFilter ( src, dst, i, i*2, i/2 );

if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

/// 等待用户输入

display_caption( "End: Press a key!" );

waitKey(0);

return 0;

}

int display_caption( char* caption )

{

dst = Mat::zeros( src.size(), src.type() );

putText( dst, caption,

Point( src.cols/4, src.rows/2),

CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

imshow( window_name, dst );

int c = waitKey( DELAY_CAPTION );

if( c >= 0 ) { return -1; }

return 0;

}

int display_dst( int delay )

{

imshow( window_name, dst );

int c = waitKey ( delay );

if( c >= 0 ) { return -1; }

return 0;

}

第二步编写CMmakeLists.txt

接下来我们编译程序。

第三步:编译程序

1>运行cmake .

cmake .

2>运行make

Make

3> 运行./display

4> 结果(视频展示)

视频内容

3 总结

Opencv实验旨在加深或者方便大家理解软件的图像处理过程,为硬件实现提供方法或者思路。

本文分享自微信公众号 - FPGA开源工作室(leezym0317)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何 10 步 Docker 化一个应用?

    网上大多数教程使用的都是以 Ubuntu(例如:Ubuntu:16.04 )作为基础镜像,这并不是一个问题,但是我建议优先考虑 Alpine 镜像:

    用户6543014
  • Android开发使用Lambda表达式

    AndroidStudio从2.1开始官方通过Jack支持Java8,从而使用Lambda等特性。

    剑行者
  • TeamViewer攻陷疑云

    TeamViewer是一个可用于Microsoft Windows、macOS、Linux、Chrome OS、iOS、Android、Windows RT、W...

    ChaMd5安全团队
  • 安利一个github上面的一个神级库thefuck,Linux命令敲错了,没关系,自动纠正你的命令

    没错就是这么神奇,名字相当噶性,thefuck。当你命令输入错误不要怕,直接来一句fuck,自动纠正你输入的命令。

    landv
  • Ubuntu 14.04 安装mysql

    wget http://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.deb

    Jackson0714
  • 禁用Compiz,太占内存

    https://zh.wikipedia.org/wiki/Compiz ,简单理解是实现了Ubuntu的3D效果

    随心助手
  • 教你几个有趣又好玩的 Linux 命令

    -a An accident seems to happen. You'll feel pity for people who cry for help.

    一个优秀的废人
  • 浅谈ATT&CK:让“攻击手法”拥有通用语言

    2019年3月的RSA 大会上,有超过10个议题讨论ATT&CK的应用,6月的Gartner Security & Risk Management Summit...

    FB客服
  • Ubuntu18.04 ROS1Melodic ROS2Dashing 机器人工具集学习镜像的制作说明 Pinguy

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    zhangrelay
  • ubuntu1~16.04.9 下安装python3.6 详细教程(在腾讯云服务器上安装实例)

    1.输入 sudo add-apt-repository ppa:jonathonf/python-3.6

    用户6544262

扫码关注云+社区

领取腾讯云代金券