图像增强之邻域对比度增强

7

你好,我想通过邻域像素值来增强图像的对比度。

假设图像为u0。然后我想使用以下公式来增强图像:

enter image description here

这里,M1是邻域像素中u0的最小值,M2是最大值,Mg是原始图像的最大灰度级值。我的操作所采用的邻域大小为9X9。uN是新生成的图像(增强对比度的图像)。

我已经尝试了以下代码,但不确定是否正确。

%Generate a contrast enhanced image
tic
clear all; close all;
I = imread('4.jpg');
I = imresize(I,[128 128]);
if size(I,3)== 3
            P = rgb2gray(uint8(I));
            P = double(P);
elseif size(I,3) == 2
            P = 0.5.*(double(I(:,:,1))+double(I(:,:,2)));
else
            P = double(I);
end
ssize=9;
mg=max(P(:));

f1 = @(x) min(x(:));
m1 = nlfilter(P,[9 9],f1);
f2 = @(x) max(x(:));
m2 = nlfilter(P,[9 9],f2);

P_op=((P-m1)./(m2-m1)).*mg;
subplot(2,1,1),imagesc(P,[0 255]);colormap(gray);axis off;
subplot(2,1,2),imagesc(P_op,[0 255]);colormap(gray);axis off;
toc

以下是我得到的一些结果: enter image description hereenter image description hereenter image description hereenter image description here 请问有人可以检查并告诉我我的代码是否正确吗?我自己也不太确定。还请告诉我是否有更好的方法来完成这个任务。先谢谢大家。
编辑后的问题:我重新阅读了工作内容,我必须将滑动窗口函数应用于仅指定的几个像素点。
我需要应用的像素点是通过以下方法找到的。首先检测图像的初始轮廓(在红色图像中显示)。然后在轮廓周围绘制一个指定距离的带状区域。原始图像中只需在该窄带内的那些像素上应用滑动窗口函数。
我提供了图像、初始轮廓和带状图像。 enter image description hereenter image description hereenter image description hereenter image description here 白色标记的像素是我需要应用滑动函数的指定像素。是否可以根据这样的条件应用nfilter?如果我的问题不正确,请帮忙澄清。

1
你的代码和结果在初步查看时似乎没问题,但这里是否有实际问题呢?如果没有,请关闭帖子。 - Roney Michael
你可以考虑使用imdilateimerode的灰度版本来计算每个像素的局部最大值/最小值。这可能比nlfilt稍微快一些。 - Shai
@Shai 谢谢您的建议。我会这样做。您能否重新查看一下我编辑过的问题? - roni
@RoneyMichael你能重新看一下我编辑过的问题吗? - roni
@roni - 我认为nlfilt不接受掩码。你可以做的是增强所有图像(就像你所做的那样),然后根据你计算出的掩码将增强的结果与原始图像合并。 - Shai
显示剩余3条评论
1个回答

0

我会用以下两种方法之一来解决它:

  1. 在整个图像上应用滤波器(使用colfilt而不是nlfilter)。
    然后将结果乘以掩模。
  2. 提取所需的像素及其邻域,将它们形成类似于colfilt的列形式,并应用滤波器。

任何一种方式都可以。
我认为对于小照片,第一种方法会更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接