Matlab 消除图像中两种颜色边缘的颜色过渡效果
我一辈子都记不起这个手术叫什么。该操作的定义使得所考虑的像素被替换为内核窗口中最高频率的像素值 其目的是消除在其他更突出区域的边缘可能发现的无关颜色,并合并为更小的颜色子集 例如,考虑刚果国旗: 如果我们放大两种颜色之间的边界,就会观察到颜色过渡效果Matlab 消除图像中两种颜色边缘的颜色过渡效果,matlab,image-processing,filter,Matlab,Image Processing,Filter,我一辈子都记不起这个手术叫什么。该操作的定义使得所考虑的像素被替换为内核窗口中最高频率的像素值 其目的是消除在其他更突出区域的边缘可能发现的无关颜色,并合并为更小的颜色子集 例如,考虑刚果国旗: 如果我们放大两种颜色之间的边界,就会观察到颜色过渡效果 出于我的目的,上图中只有两种颜色,但对角线形状适合于边界颜色的混合 这称为模式过滤器,因为您将用相邻像素的模式(或最常用值)替换每个像素 在MATLAB中,如果您有图像处理工具箱,您可以轻松地执行这种类型的过滤,使用它将在指定大小的邻域内应用提
出于我的目的,上图中只有两种颜色,但对角线形状适合于边界颜色的混合 这称为模式过滤器,因为您将用相邻像素的模式(或最常用值)替换每个像素 在MATLAB中,如果您有图像处理工具箱,您可以轻松地执行这种类型的过滤,使用它将在指定大小的邻域内应用提供的函数
output = colfilt(data, [5 5], 'sliding', @mode)
更新
如果不想处理边缘的所有零填充,可以使用padarray
将3个像素的填充应用到每侧,然后执行过滤,然后从所有边缘移除额外的3个像素
% Pad with replicates of the data
data = padarray(data, [3 3], 'replicate', 'both');
% Perform the filtering
new = colfilt(data, [5 5], 'sliding', @mode);
% Crop out the padding part
new = new(4:end-3,4:end-3);
如果要将其推广到大小为n
的内核,可以使用以下函数:
function out = mode_filter(data, n)
pad_size = ceil(n / 2);
% Pad with replicates of the data
data = padarray(data, [pad_size, pad_size], 'replicate', 'both');
% Perform the filtering
out = colfilt(data, [n n], 'sliding', @mode);
% Crop out the padded part
out = out((pad_size + 1):(end - pad_size), (pad_size + 1):(end - pad_size));
end
这几乎是完美的。这个解决方案的唯一问题似乎是,
colfilt
的实现将0-pad边缘,从而损坏图像的某些位置。我的Matlab经验有限,但您是否知道一种填充图像边界的方法,但只处理原始边界,这样我们就可以避免0填充的影响?@sherrellbc我添加了一种方法来添加填充,然后删除填充,以产生更好的结果。