matlab数字图像处理-消除条纹干扰

2023-11-13

一、 背景

下图含有干扰条纹、并且低灰度区域的细节难以分辨。对图像进行灰度变换,再分别应用空域和频域的处理方法消除条纹干扰,并比较这两类方法去除条纹干扰的效果。
在这里插入图片描述

二、算法原理

因为低灰度区的细节难以分辨,所以先将图像整体均衡化,见图1-2,使整体的细节变亮,更清楚观察到条纹的细节。

1.频域方法处理

对均衡化后的图像进行傅里叶变换,将低频移至图像的中心点,显示其log变换后的频谱图,见图1-3,发现其频谱图中心取有条纹产生的噪声(频谱图中心区竖直方向),想要去掉条纹,就要设计滤波器过滤掉某一低频部分,通过查资料,这里用到了陷波滤波器。陷波滤波器指的是一种可以在某一个频率点迅速衰减输入信号,以达到阻碍此频率信号通过的滤波效果。陷波滤波器属于带阻滤波器的一种,只是他的阻带非常狭窄。设计预估陷波滤波器的圆心为图像的(w/4,h/2)和(3w/4,h/2)为圆心,以1/5倍的行列的最小值为半径,见图2,通过对频域的相乘,对应于时域的卷积,完成对于某一低频域的陷波,从而完成对一低频部分的滤波,去除条纹。

2.空域方法处理

空域办法处理的这里采用的是中值滤波,中值滤波用一个含有奇数个像素的窗口在图像中滑动,将窗口中心点的灰度值用窗口内各点的灰度值的中值代替。滤波的效果和窗口的大小有关系,正确选择窗口的大小使用好中值滤波的关键。这里取得w=6,对于图像有着横向的干扰条纹,所以只对竖直方向取中值,使条纹消除,见图3。

三、算法步骤

(1)扩充边界
(2)取中值
(3)显示处理图像

四、matlab程序代码

clc;
clear;
close all;
f=imread('hw2_rg.jpg');
f=rgb2gray(f);
figure;
subplot(2,2,1);imshow(f);title('原图');
%% 均衡化
h=zeros(256,1);
for k=0:255
    h(k+1)=sum(sum(f==k));
end
p=h/sum(h);
s=zeros(256,1);
s(1)=p(1);
for k=2:255
    s(k)=s(k-1)+p(k);
end
f=double(f);
[r,c]=size(f);
t=zeros(256,1);
t=double(t);
for m=1:r
    for n=1:c
        t(m,n)=s(f(m,n)+1);
    end
end
subplot(2,2,2);imshow(t);title('均衡化后的图像');
%% 频谱图
g=uint8(t*255);
s=fft2(g);
s_shift=fftshift(s);
subplot(2,2,3);
imshow(log(1+s_shift),[]);title('均衡化后频谱图');
%% 陷波滤波
H= zeros(size(g));
[w,h]=size(g);
%滤波器圆心
rx1 = w / 4;
ry1 = h / 2;
rx2 = w * 3 / 4;
ry2 = h / 2;
r = min(w,h)/5;%半径
for i = 1:w
    for j = 1:h
        if(i-rx1)^2+(j-ry1)^2 >= r*r && (i-rx2)^2+(j-ry2)^2 >= r*r
            H(i,j) = 1;
        end
    end
end
G=H.*s_shift;
g=ifft2(ifftshift(G),'symmetric');
g=uint8(real(g));
subplot(2,2,4);imshow(g);title('滤波变换图');
figure;imshow(H);
 
%% 中值滤波
t=t*255;
w=6;
fn=padarray(t,[w w],'symmetric');
[r,c]=size(fn);
g=zeros(r,c);
nc=ceil((2*w+1)/2);
for m=1+w:r-w
    for n=1+w:c-w
        roi=fn(m-w:m+w,n);
        p=sort(roi(:));
        g(m,n)=p(nc);
    end
end
g=g(1+w:r-w,1+w:c-w);
figure;
subplot(1,2,1);imshow(t,[]);
subplot(1,2,2);
imshow(g,[]);
title('中值滤波');

五、处理结果

图1:
在这里插入图片描述
图2:
在这里插入图片描述
图3:
在这里插入图片描述

六、总结

对于均值滤波,他是将图像平滑来减弱噪声,无法真正去除,所以图像会变得模糊,但是其算法简单,运算速度较中值滤波快。而对于中值滤波,采用非线性的办法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘。对于成三角变化的边缘,中值滤波有轻微的模糊,对于一般的孤立噪声有很好的抑制效果,加权中值滤波可以改进中值滤波的边缘信号保持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab数字图像处理-消除条纹干扰 的相关文章

  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 将 kinect RGB 和深度值转换为 XYZ 坐标

    我正在寻找一种简单的方法将 kinect RGB 和深度值转换为 XYZ 坐标 使用 MATLAB 我的目标是一个输入为以下内容的函数 每个点的 RGB 和深度值Kinect相机 并输出 每个点的 x y 和 z 值 RGB 深度 RGB
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000

随机推荐