machine learning首页投稿(暂停使用,暂停投稿)程序员

Octave简单应用(一)

2016-05-31  本文已影响3813人  _小眼睛_
OctaveOctave

Octave 是一个旨在提供与Matlab语法兼容的开放源代码科学计算及数值分析的工具;它提供了方便的互动命令列接口来解决线性与非线性的数值运算问题,并可将计算结果可视化,与高价的商业软体MATLAB语法几乎兼容

环境搭建

安装octave

Mac OSX平台下,用神器Homebrew安装

brew tap homebrew/science
brew update && brew upgrade 
brew install octave 

安装完成看到如下提示:

setenv('GNUTERM','qt')    # Requires QT; install gnuplot --with-qt
setenv('GNUTERM','x11')   # Requires XQuartz; install gnuplot --with-x11
setenv('GNUTERM','wxt')   # Requires wxmac; install gnuplot --with-wxmac
setenv('GNUTERM','aqua')  # Requires AquaTerm; install gnuplot --with-aquaterm

这里提示我们要设置默认的graphics toolkit。首先选择GUI的展示基于那种框架,我选择x11。安装gnuplot:

brew install gnuplot --with-x11

配置

在 .bash_profile种添加环境变量

export FONTCONFIG_PATH=/opt/X11/lib/X11/fontconfig 

配置默认的graphics toolkit ,在配置文件
/usr/local/share/octave/site/m/startup/octaverc 中添加 setenv('GNUTERM','x11')

启动

直接命令行执行octave ,或者保存成脚本,打开脚本编辑器新加脚本

tell application "Terminal"
 do script "`which octave`; exit"
end tell

保存成octave.app,在Launchapad中可以看到octave.app的图标,点击即可打开ocatave

在命令窗口种安装需要的package,比如image:

pkg install -forge image

简单操作

矩阵操作矩阵操作 函数图像函数图像

几种滤波器实现

均值滤波器

原理:

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。

实现:

function [retval] = avg_filter (matrix,n)
##转成double计算
rst = double(matrix);
[row, column] = size(matrix);
model(1:n,1:n) = 1
for i=1:row-n+1
  for j=1:column-n+1
    c = rst(i:i+(n-1),j:j+(n-1)).*model;
    s = sum(sum(c));
    #模板内像素平均值
    rst(i+(n-1)/2,j+(n-1)/2) = s/(n*n);
  end
end
retval = uint8(rst);
endfunction

缺点:

它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点

示例:

原始图片

原始图片原始图片

结果图片

结果图片结果图片

中值滤波器

原理:

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3\3,5\5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

实现:

function [retval] = middle_filter (matrix,n)
#转成double计算
rst=double(matrix);
[row, column]=size(matrix);
for i=1:row-n+1
  for j=1:row-n+1
    #取出从(i,j)开始的n行n列元素,即模板(n×n的)
    col = rst(i:i+(n-1),j:j+(n-1));
    #将分块矩阵变为一个行矩阵
    tmp = []
    for index=1:n
      tmp=[tmp,col(index,:)];
    end
    #求中值
    mm=median(tmp);
    rst(i+(n-1)/2,j+(n-1)/2)=mm;
  end
end
#转成uint输出
retval = uint8(rst);
endfunction

缺点:
基于图像滤波器所包围区域中像素(灰度)的排序,选择适当的点来替代污染点的值,所以处理效果好。因为噪声的均值不为0,所以均值滤波不能很好地去除噪声点

示例:

原始图片(被脉冲噪声污染的电路板的图像)

原始图片原始图片

处理之后

处理之后处理之后
上一篇下一篇

猜你喜欢

热点阅读