【matlab图像处理】插值方法

中国史之【懿王攻犬戎】:
周懿(yi)王攻打犬戎的战争。周懿王在位时期,西周衰弱,戎族不断入侵周朝,一度打到镐(今陕西西安)、岐(今陕西岐县)等地,懿王被迫迁都槐里(今陕西兴平县)。周懿王派虢(guo)公率军北伐犬戎,企图收复失地,但不幸战败。
——来源:全历史APP

【路漫漫其修远兮,吾将上下而求索】

今天介绍图像的几何操作之插值方法。本内容参考自《实用MATLAB图像和视频处理》第7章。

1、为什么需要插值(Interpolation)?

对原始图像进行几何操作后,各个像素的结果值可用两种不同的方法计算,也就是前向映射(源到目标的映射)后向映射(目标到源的映射)。

(1)前向映射

对于前向映射,它需要计算输入图像所有像素的新坐标,并将其值复制到新的位置。其示意图如下:
在这里插入图片描述
从上面的示意图可以看到,从坐标(x, y)到(x’, y’),会存在一些问题:

  • 由变换式得到的坐标(x’, y’)有可能不是整数,不是刚好落在离散的光栅点(如上图),所以需要四舍五入到最接近的整数。
  • 很多坐标可能落到界外(如负的值)
  • 很多输出像素的坐标在计算中赋值了多次(冗余),但有些坐标却根本没有赋值过,这就导致在输出图像中出现“孔洞”,即对这些坐标没有可计算的像素值

(2)后向映射
为了克服前向映射的问题,常使用后向映射,也就是目标到源的映射。它需要访问输出图像中的每个像素并使用逆变换确定输入图像中需要采样像素值的坐标。其示意图如下:
在这里插入图片描述
同理,因为这种后向映射过程常产生在原始图像采样网格点之外的结果,一般还需要某种形式的插值,以计算一个像素的最佳值。

2、简单的插值方法

插值是非常普遍的,比如图像放大两倍可以通过像素复制来达到效果,而图像缩小两倍可以通过像素删除来完成。但这种简单粗暴的方式会遇到一些问题:

  • 当放大图像时,一些重复块的效应变得很明显
  • 当缩小图像时,可能会删除一些本质的信息
  • 这种简单粗暴的方式很难将其推广到任意的、非整数的缩放因子

下面简单介绍几种常见的插值方式,不会详细介绍原理,具体可自行查询。

3、零阶(最近邻)插值

这是一种很简单的插值思路,它将计算的坐标(x’, y’)舍入到它们最近的整数。通俗来讲,也就是通过变换后,(x’, y’)如果不是整数,将其四舍五入成整数。

显然,零阶(最近邻)插值简单且计算快,但其生成的结果质量低,包括:

  • 块效应:在块的边界会出现不连续,形成的图像有明显缺陷,在大尺度时更明显
  • 锯齿状直线,特别在旋转非90度整数倍的角度时更明显,如下图。

4、一阶(双线性)插值

双线性插值被用在深度学习的经典分割模型Mask RCNN中。它使用输入图像中参考像素附近的4个像素灰度值的加权函数来计算插值像素的灰度值。

它的视觉效果比最近邻插值要好,但是需要更多的CPU计算资源。如下图:

5、高阶插值

高阶插值方法更复杂,且计算代价更大。若使用3阶插值方法,可称为双立方插值。它考虑参考像素附近的4*4邻域并通过将该领域与一个立方函数卷积来计算插值像素的灰度值。

最后,我们整体看一下效果,对一幅旋转35度后的图像使用不同的插值方法,并且放大局部得到的结果如下图所示。
从上面的结果可以看出,最近邻插值虽然计算量少,但是其锯齿边缘效应很明显,而双线性插值和双立方插值结果不错。

以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍图像处理的几何操作实践。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我【CV之道】一起学习。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: NEDI(New Edge-Directed Interpolation)是一种基于图像边缘信息的图像插值算法,其目标是在插值过程中保持图像的边缘信息。下面是一个简单的基于MATLAB的NEDI图像插值代码示例: ```matlab function output_image = nedi_interpolation(input_image) [m, n] = size(input_image); % 获取输入图像的尺寸 output_image = zeros(2*m, 2*n); % 创建一个2倍于输入图像大小的输出图像 for i = 1:m for j = 1:n % 获取当前像素的值 current_pixel = input_image(i, j); % 计算当前像素周围的邻域值(可以根据需要选择邻域大小) neighborhood = input_image(max(i-1, 1):min(i+1, m), max(j-1, 1):min(j+1, n)); % 计算邻域内像素的方差 variance = var(neighborhood(:)); % 判断当前像素是否为边缘点 if variance > threshold % 这里的threshold是一个自定义的阈值 % 如果当前像素是边缘点,则直接将该像素的值赋给输出图像 output_image(2*i-1, 2*j-1) = current_pixel; else % 如果当前像素不是边缘点,则采用双线性插值计算插值结果 output_image(2*i-1, 2*j-1) = current_pixel; output_image(2*i, 2*j-1) = 0.5 * (current_pixel + input_image(min(i+1, m), j)); output_image(2*i-1, 2*j) = 0.5 * (current_pixel + input_image(i, min(j+1, n))); output_image(2*i, 2*j) = 0.25 * (current_pixel + input_image(i, min(j+1, n)) + input_image(min(i+1, m), j) + input_image(min(i+1, m), min(j+1, n))); end end end end ``` 该代码通过遍历输入图像的每个像素,根据其周围像素的方差来判断当前像素是否为边缘点。如果是边缘点,则直接将该像素的值赋给输出图像。如果不是边缘点,则采用双线性插值方法计算插值结果。最终输出图像的尺寸是输入图像尺寸的2倍。需要注意的是,代码中的threshold和邻域大小可以根据实际需求进行调整。 ### 回答2: NEDI是一种图像插值算法,它基于样本图像以及附加的噪声图像来实现插值。下面是一份使用MATLAB实现NEDI图像插值的代码示例: ```matlab function interpolated_image = nedi_interpolation(original_image, noise_image) % 设定参数 patch_size = 9; sigma = 0.03; % 将输入的图像转为灰度图像 original_image = rgb2gray(original_image); noise_image = rgb2gray(noise_image); % 构造一维滤波器 filter = fspecial('gaussian', patch_size, sigma); % 初始化输出插值图像 interpolated_image = original_image; [rows, cols] = size(original_image); % 对每个像素进行插值 for i = 1:rows for j = 1:cols % 获取当前像素在附加图像中的对应位置 i_n = round(i/2); j_n = round(j/2); % 获取当前像素的邻域图像块 patch_original = original_image(max(i-patch_size/2, 1):min(i+patch_size/2, rows), max(j-patch_size/2, 1):min(j+patch_size/2, cols)); patch_noise = noise_image(max(i_n-patch_size/2, 1):min(i_n+patch_size/2, rows/2), max(j_n-patch_size/2, 1):min(j_n+patch_size/2, cols/2)); % 对邻域图像块进行滤波 patch_filtered = imfilter(patch_noise, filter); % 计算邻域图像块的均方根误差 rmse = sqrt(mean((patch_original(:) - patch_filtered(:)).^2)); % 根据均方根误差进行插值 if rmse >= sigma interpolated_image(i, j) = patch_filtered(patch_size/2+1, patch_size/2+1); end end end end ``` 使用此代码,您可以将输入图像和附加的噪声图像作为参数传入,并获得使用NEDI算法插值后的图像作为输出。该算法通过比较局部块的像素值来决定是否进行插值,从而实现对噪声图像的修复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackkoLing

感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值