模糊集合原理

在计算机编程的时候,常常会使用一种“干脆的”集合。在判断某件事,或者某个变量的时候,常常使用的是布尔值(因为某件事,不是真就是假)。通过一个阈值,去判断这件事,而这样的一个阈值的设定,会产生一个问题。还是使用《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods书中的例子,看以下两个图。

当一个人的年龄超过20岁,那么这个人就不再属于年轻人范畴。这样来说,未免有些太过“残忍”,毕竟,20多岁的人还是“比较”年轻的。这里就出现了一个模糊的定义,“比较”年轻,这个集合既不属于年轻,也不属于非年轻,也就是其实年轻与非年轻之间的过度不应该是干脆的,而应该是渐进的过度。

定义Z为对象集,其中,z表示Z中的一类元素(比如z表示年龄)。Z中的一个模糊集合A主要由一个隶属度(Degree of membership)来表示。对此,模糊集合A是一个由z值和隶属度函数组成的集合,即

的时候,所有的z是模糊集合A的完全成员‘;当的时候,所有的z都不是模糊集合A的成员,当的值介于0和1之间,那么此时的z称为模糊集合A的不完全成员。

下面,还有几个重要的性质。

对于所有的,模糊集合A的补集(NOT),其隶属度函数如下所示。

对于所有的,模糊集合A与模糊集合B的并集(OR)U,其隶属度函数如下所示。

对于所有的,模糊集合A与模糊集合B的交集(AND)I,其隶属度函数如下所示。

到这里,其实已经可以用模糊集合来做一些事情了。对于一个问题的处理,在使用模糊集合来解决的时候,我们可以参考以下步骤。首先,需要将输入量折算为隶属度,这个过程叫做“模糊化”。然后,使用得到的隶属度来进行计算,或者判断,或者其他更复杂的算法。最后,需要将隶属度再次折算为输出,这个过程称为“去模糊”或者“反模糊”。

通过下面两个例子,来具体体会一下模糊算法在图像处理上的运用。

使用模糊集合进行灰度变换

使用模糊集合来进行灰度变换,从而增强图像。首先可以在常理下考虑一下,一般的对于动态范围较小的图像,我们一般的处理的方法是灰度拉升,或者直方图均衡。这两种的方法的本质就是,让原图较暗的像素更加暗,让原图较亮的像素更加亮。那么,我们规定如下模糊规则

R1:IF 一个像素是暗的,THEN 让这个像素更暗;

R2:IF 一个像素是灰的,THEN 让他保持是灰的;

R3:IF 一个像素是亮的,THEN 让这个像素更亮;

这个规则就代表了我们的处理方法。当然,IF条件中的像素是暗的(或者灰的,或者是亮的),这个概念都是模糊的。同理THEN结论中的更暗(或者保持灰的,或者更亮)亦是模糊的。为此,我们需要确立一个隶属度函数,从而来判断一个像素对于三个条件的隶属度。

实际上,隶属度函数的确定是很复杂的,然而,这里我们则尽量想得简单一点。首先,一个像素是暗的(模糊),那么其隶属度函数大致的形状是,在低于某个值的时候域隶属度为1,在灰度越过某一个值之后,其隶属度为0,当然。然后之间进行线性插值,那么,我们就可以得到R1的隶属度函数了。同理,R2与R3也是一样的。

为了简单起见,我们将THEN结论中的更暗设置为较为简单的函数。为了让这个像素更黑,其输出都为0。同理,为了使这个像素保持灰的,我们将其输出设为0.5,为了使得一个像素更亮,我们将其设置为1。

根据以上讨论,我们所决定的隶属度函数如下所示。

使用输入的隶属度函数,可以得到模糊化后的数据。对于一个像素,需要根据规则R1,R2与R3,计算出所对应的隶属度,这个过程,称之为模糊化。将一个输入量模糊化,所使用的函数(或者说是对应关系),称之为知识库。

模糊化之后,得到一个像素所对应的三个隶属度之后,就可以进行反模糊化了。反模糊化的算法很多,这里使用简单的重心法去进行计算。

到此,就得到了输出,整个算法的效果如下图所示。

根据以上算法,所得到的结果还是比较理想的。从灰度直方图来看,处理后的图像的直方图的动态范围得到了扩展,所得的图像也比原图更加的明亮清晰,图片的一些细节处理的较为妥当。所使用的Matlab代码如下所示。

function [drak,gray,brig] = Fuzzy_Knowledge(Intensity)
if(Intensity <= 0.27) drak = double(1);
elseif(Intensity >= 0.5) drak = double(0);
else drak = (0.5 - double(Intensity))/(0.22);
end
if(Intensity >= 0.72) brig = double(1);
elseif(Intensity <= 0.5) brig = double(0);
else brig = double((double(Intensity) - 0.5)/0.22);
end
if(Intensity >= 0.72) gray = double(0);
elseif(Intensity <= 0.27) gray = double(0);
elseif(Intensity <= 0.5) gray = double((double(Intensity) - 0.27)/0.22);
else gray = double((0.72 - double(Intensity))/0.22);
end
end
close all;
clear all;
clc;
%% ---------Using Fuzzy for intensity transfromations---------------
f = imread('einstein_orig.tif');
f = mat2gray(f,[0 255]);
[M,N]=size(f);
g = zeros (M,N);
for x = 1:1:M
for y = 1:1:N
[drak,gray,brig] = Fuzzy_Knowledge(f(x,y));
g(x,y) = ((drak * 0) + (gray * 0.5) + (brig * 1))/(drak + gray + brig);
end
end
figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(1,2,2);
imshow(g,[0 1]);
xlabel('b).Result of fuzzy');
figure();
subplot(1,2,1);
h = imhist(f)/(M*N);
bar(0:1/255:1,h);
axis([0 1 0 .2]),grid;
xlabel('c).The Histogram of a');
subplot(1,2,2);
h = imhist(g)/(M*N);
bar(0:1/255:1,h);
axis([0 1 0 .2]),grid;
xlabel('d).The Histogram of b');
%%
test = 0:1/255:1;
for x = 1:1:256
[drak(x),gray(x),brig(x)] = Fuzzy_Knowledge(test(x));
end
figure();
subplot(1,2,1);
plot(test,drak,test,gray,test,brig);
axis([0,1,0,1]),grid;
axis square;
legend('drak','gray','brig');
xlabel('a).Input memberchip functions for fuzzy');
subplot(1,2,2);
x1 = [0,0];y1 = [0,1];
x2 = [0.5,0.5];y2 = [0,1];
x3 = [1,1];y3 = [0,1];
plot(x1,y1,x2,y2,x3,y3);
axis([-0.1,1.1,0,1.2]),grid;
axis square;
legend('drak','gray','brig');
xlabel('b).Output memberchip functions for fuzzy');

使用模糊集合进行边缘检测

为了更深刻的理解模糊集合的性质,可以将规则的难度加深一些。若想进行一幅图像的边缘检测,在空间域上的想法是:“如果一个像素是处在平滑区域的,那么使得这个像素为亮,否则,则使得这个像素为暗。”为了使得这个算法在模糊集合的概念可以用,我们可以考虑使用灰度差来表示像素的平滑程度。

如上图所示,我们将一个像素8个相邻的像素,各减去这个像素的值,即。我们可以得到如上图右侧的结果。基与此,可以推出以下规则。

注意,上述的zero,white与black都是模糊的概念。同样的,根据这三个规则模糊化之后,用重心法去模糊。同时,我们还希望,当两个点的灰度很接近的时候,去模糊能给予一个很强的响应,将灰度拉至很高(很亮)。所以,我们的输入隶属度函数需要再0处有一个较大的隶属度,这里,我使用了高斯分布的一部分。其输出隶属度函数,也不是像上面的例子一样简单,我希望若是白色的隶属度很高,其输出的灰度值就越高(越亮),反之则越低(越暗)。根据上述,我指定的输入输出隶属度函数如下所示。

以上规则还出现了几个比较需要注意的地方。我们制定规则的时候,使用了AND,将两个条件相连了。这里在模糊集合里面,就相当于两个模糊集合的交集。首先,应该依次算出两个条件所对应的隶属度的值,然后,取最小值即可,如下所示。

其次,这里还出现了ELSE语句,这里,可以视为以上四个条件的补集的交集(有点拗口)。其实看数学式的话,应该很好明白的。

到这里,我们就可以顺利的算出上述五个条件的隶属度,然后同样的,使用最简单的重心法,就可以得到结果了。结果如下所示。

从结果可以看出来,根据整定的规则,我们已经很好的得到了图像的边缘。在这幅图像上再次进行加工,二值化什么的,就比较容易了。所得到的结果图像还是比较清晰的。以下是Matlab代码。

function [W1,W2,W3,W4,B] = Fuzzy_Knowledge_Filters(Intensity)
for x = 1:1:3
for y = 1:1:3
if((Intensity(x,y) <= 0.2) &&(Intensity(x,y) >= -0.2))
Intensity(x,y) = exp(-20*Intensity(x,y).*Intensity(x,y));
else Intensity(x,y) = 0;
end
end
end
W1 = min(Intensity(1,2),Intensity(2,3));
W2 = min(Intensity(2,3),Intensity(3,2));
W3 = min(Intensity(3,2),Intensity(2,1));
W4 = min(Intensity(2,1),Intensity(1,2));
B = min(min(1-W1,1-W2),min(1-W3,1-W4));
end
%% ---------Using Fuzzy for Spatial Filters---------------
close all;
clear all;
clc;
f = imread('headCT_Vandy.tif');
f = mat2gray(f,[0 255]);
[M,N]=size(f);
f_Ex = zeros(M+2,N+2);
for x = 1:1:M
for y = 1:1:N
f_Ex(x+1,y+1) = f(x,y);
end
end
z = zeros (3,3);
g = zeros (M+2,N+2);
for x = 2:1:M+1
for y = 2:1:N+1
z(1,1) = f_Ex(x-1,y-1) - f_Ex(x,y);
z(1,2) = f_Ex(x-1,y) - f_Ex(x,y);
z(1,3) = f_Ex(x-1,y+1) - f_Ex(x,y);
z(2,1) = f_Ex(x,y-1) - f_Ex(x,y);
z(2,2) = f_Ex(x,y) - f_Ex(x,y);
z(2,3) = f_Ex(x,y+1) - f_Ex(x,y);
z(3,1) = f_Ex(x+1,y-1) - f_Ex(x,y);
z(3,2) = f_Ex(x+1,y) - f_Ex(x,y);
z(3,3) = f_Ex(x+1,y+1) - f_Ex(x,y);
[W1,W2,W3,W4,B] = Fuzzy_Knowledge_Filters(z);
V1 = 0.8 * W1 + 0.2;
V2 = 0.8 * W2 + 0.2;
V3 = 0.8 * W3 + 0.2;
V4 = 0.8 * W4 + 0.2;
V5 = 0.8 - (0.8 * B);
g(x,y) = ((W1*V1) + (W2*V2) + (W3*V3) + (W4*V4) + (B*V5))/(W1+W2+W3+W4+B);
end
end
figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(1,2,2);
imshow(g,[0 1]);
xlabel('b).Result of fuzzy');
%%
figure();
subplot(1,2,1);
x=-0.2:1/255:0.2;
y=1/sqrt(2*pi)*exp(-20*x.*x);
y = y/max(y);
x = -1:1/255:1;
y = [zeros(1,204) y zeros(1,204)];
plot(x,y);
axis([-1,1,0,1]),grid;
axis square;
xlabel('a).Input memberchip functions for fuzzy');
subplot(1,2,2);
x1 = [0,0.2,1];y1 = [0,0,1];
x2 = [0,0.8,1];y2 = [1,0,0];
plot(x1,y1,x2,y2);
axis([0,1,0,1]),grid;
axis square;
legend('WH','BL');
xlabel('b).Output memberchip functions for fuzzy');

(作者注:其实模糊算法是很复杂的一门学科,《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods这本书上讲的还是太过简单了,仅仅也只是算皮毛而已,对于模糊算法还没有一个清晰的认识。残留下来了几个问题:①隶属度函数的制定有什么样的原则?②我们再使用模糊算法之前,希望得到一个什么样的结果,而实际得到的结果又怎么样去评估这个算法的好坏呢?③其他的反模糊算法与重心法的区别是什么?这些问题还有待深入的研究)

博客地址:http://blog.csdn.net/thnh169/

[数字图像处理]模糊算法用于图像增强相关推荐

  1. 【计算机视觉】数字图像处理(四)—— 图像增强

    数字图像处理(四)-- 图像增强 图像增强的定义 图像增强方法 一.图像增强的点运算 (一)灰度变换 1. 线性变换 2. 分段线性变换 3. 非线性灰度变换 对数变换 指数变换 (二) 直方图修整法 ...

  2. 视频教程-数字图像处理实战-算法基础

    数字图像处理实战 河海大学计算机硕士毕业,现就职于南京华为研究所,从事嵌入式软件开发工作.热爱模式识别及机器学习算法. 金圣韬 ¥70.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+ ...

  3. Python实现数字图像处理经典算法之256色转灰度图

    算法介绍 256色转灰度图是数字图像处理经典算法中最简单的算法之一 1.彩色数字图像中的颜色有红.绿.蓝三种颜色混合而成,对应的像素颜色通道就是RGB(R,G,B),R.G.B数值共有256个数值,也 ...

  4. Python_OpenCV_实现模糊集合用于图像增强(对比度提升,空间滤波)

    本文部分内容来自: https://blog.csdn.net/qq_37764129/article/details/82893966 模糊集的详细原理请看冈萨雷斯的数字图像处理教程,这里不再详细赘 ...

  5. 【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑.高斯 ...

  6. matlab数字图像处理:时空域图像增强

    在数字图像处理领域,对于时空域图像的增强一般包括运用直方图均衡.亮度变换.空域平滑和锐化等方法实现对于给定图像的时空域的增强. 本文所展示的内容包括: (1)计算并绘制图像直方图,编程实现图像的直方图 ...

  7. 数字图像处理(3)图像增强(上)

    内容来自于刘定生老师的数字图像处理课和课件,如有侵权,联系删除. 图像增强目的是改善图像质量. 造成图像质量损坏的因素: 1.图像传输时,由于信道带宽限制造成的图像模糊: 2.噪声干扰:加性噪声.乘性 ...

  8. 数字图像处理:实验三 图像增强

    实验三 图像增强 图像增强是数字图像处理过程中常采用的一种方法.为了改善视觉效果或便于人和机器对图像的理解和分析,根据图像的特点或存在的问题采取的改善方法或加强特征的措施称为图像增强.图像增强处理是改 ...

  9. MATLAB说明图像增强,MATLAB数字图像处理(二)图像增强

    1         图像增强 1.1            直方图均衡化 对于灰度图像,可以使用直方图均衡化的方法使得原图像的灰度直方图修正为均匀的直方图. 代码如下: 1 2 3I2=histeq( ...

  10. 数字图像处理之空间域图像增强

    滤波过程就是在图像f(x,y)中逐点移动模板(即滤波器),使模板中心和点(x,y)重合,滤波器在每一点的响应是根据模板的具体内容并通过预先定义的关系计算的. 将图像的模板在图像中逐像素移动,并对每个像 ...

最新文章

  1. Windows 10 太难用,如何定制你的 Ubuntu?
  2. 新兴的短距离传输技术-zigbee技术
  3. 对于随机森林的通俗理解
  4. 凯立德3d实景地图_360全景地图、3D全景地图、三维实景地图哪个好?
  5. classes maven 为空 打包_Maven打包:将classes打成Jar,之后打到War中(或打成jar),过滤指定目录。...
  6. 码农回忆刚毕业工作的那年
  7. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
  8. 通过Windows组策略限制证书组织流氓软件的安装运行
  9. MSBuild 命令参数
  10. matlab保存每次循环的结果
  11. Luogu4114 Qtree1
  12. hbase java客户端_【HBase教程】(八)HBase JAVA 客户端API使用
  13. 机载激光雷达原理与应用科普(六)
  14. Windows下最快的磁盘空间分析软件——WizTree
  15. java日志(四)--jcl和log4j及log4j2使用
  16. 《易学C++(第2版)》——2.2 如何创建一个程序
  17. Qt错误:LNK1181:无法打开输入文件“debug\main.obj”
  18. js 校验字符串是否为数字和字母组合
  19. 实时在线游戏服务器客户端交互总结
  20. 我们应该怎样做需求分析?(一)需求调研

热门文章

  1. windows10流媒体服务器文件查看,win10的流媒体怎样启用?Win10启用流媒体的方法
  2. dex文件解析(第三篇)
  3. 全球及中国触屏控制器芯片行业研究及十四五规划分析报告
  4. win7无法连接打印机拒绝访问_如何解决Win7共享打印机拒绝访问的问题?
  5. 微信扫一扫下载apk解决方案
  6. Java多线程系列--“JUC线程池”03之 线程池原理(二)
  7. Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
  8. c语言趣味菜单实验报告,DSP实验报告+心得体会
  9. 潮流零售KK集团半年巨亏44亿,是风口还是泡沫?
  10. 互联网公益陷入信任危机,智慧公益能否力挽狂澜?