IDL(彩色)图像处理(2)

1.图像滤波处理
均值平滑利用smooth函数
result=smooth(img,width,/edge_truncate)
img是数组,做图像处理就用img代替了,width是卷积核的宽度,一般3或5。
/Edge_truncate关键字用于设置图像边缘是否进行扩展之后滤波。个人觉得设置上就行。

中值滤波用median()函数,与smooth函数用法基本相同。
result=median(img,width)

这两个函数写一个例子:

pro picture_process
fn=dialog_pickfile(title='')
if fn eq !null then return
img=read_image(fn)
img_smooth=smooth(img,[1,20,20]) ;这里的width用法特殊,
是在不同维度上设置卷积核,因为是rgb图像,必须有多波段卷积核设置
result=image(img_smooth)
end

我和我舍友一个校草合照了一张:
在这里插入图片描述
舍友太帅了我顶不住。
下面将我和校草舍友的合照进行均值平滑:
变得糊起来
大家模糊起来
2.锐化(边缘提取,边缘增强)
就列举遥感导论上介绍的三种算子:Roberts,Sobel,Laplacian三个。
result=roberts(image)
result=sobel(image)
result=laplacian(image)
3.自己设置卷积核进行运算
result=convol(img,kernel,scale_factor,/normalize,/edge_truncate,/edge_zero)
img是输入的图像,kernel是自我设置的卷积核,scale_factor设置比例系数,就是用这个值乘以每一个像元值,若设置/normalize则此值失效。edge_truncate用法与均值平滑相同,依我看设置上就行。
例子:用我自己胡乱设置的卷积核对我和校草的图像进行处理:

pro picture_process
fn=dialog_pickfile(title='')
if fn eq !null then return
img=read_image(fn)
kernel = [ [[0,1,0],[-1,0,1],[0,-1,0]],[[0,1,0],$
  [-1,0,1],[0,-1,0]],[[0,1,0],[-1,0,1],[0,-1,0]] ]
img1=convol(img,kernel)
result=image(img1)
end

这里卷积核设置复杂的原因也是因为三维图像要设置不同波段上的卷积核。这也是第二章节锐化里面无法对彩色图像进行处理的原因。
在这里插入图片描述
大家变成了留学生,洋大人。
4.图像裁剪
没有啥函数(如果不用envi接口,用的话有的)

subraster=envisubsetraster(input_raster,sub_rect=[x1,y1,x2,y2]) ;调用envi接口进行空间裁剪
徐永明的书写了,就是取一个空间子集:
img_clip=img[*,0:100,0:100]
下面对我和校草的图片进行空间裁剪:

pro picture_process
fn=dialog_pickfile(title='')
if fn eq !null then return
img=read_image(fn)
result=image(img[*,0:300,0:300])
end

在这里插入图片描述
5.图像重采样
rebin()可以修改数组的大小,行列数必须是原来的整数倍!
变大时会插值,默认算法双线性内插法,/sample关键字设置为最近邻域。
congrid()将数组调整成同维数任意大小,一维和二维数组默认算法最近邻域法,三维时采用双线性内插法,关键字/interp为双线性内插法,/cubic为三重卷积内插法。
在缩小数组的时候,如果使用rebin函数,则会进行插值处理,如果使用congrid函数则仅仅进行重采样。
下面对我和校草的图像进行重采样:

pro picture_process
fn=dialog_pickfile(title='')
if fn eq !null then return
img=read_image(fn)
img1=congrid(img,3,400,400,/interp)
result=image(img1)
end

在这里插入图片描述
变瘦,舍友高兴非常。
6.图像的转置(可以用于波段变换)
result=transpose(img,[P])
img是输入的图像,[P]是设置的转置方式,就是谁在前谁在后。可以用于转换波段顺序。
例如某影像有三个波段,bsq排列的:[3,600,600]
可以写:result=transpose(data,[1,0,2])
这样子就是把原本在中间的600排在第一,把3排在第二,把最后的600还是排在第二,变为:[600,3,600] 这样子就变为BIL

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值