2018-12-20 10:58:40 qq_41881554 阅读数 422

简要原理

详细原理见《数字图像处理》3.8

这里作简要说明:

为了用模糊术语表示“平滑区”,我们考虑中心领域处像素和中心像素的灰度差。

 如下图所示,我们将一个像素8个相邻的像素,各减去这个像素的值,即,di=di-z5

图1

现我们使用以下规则来判断输出像素是白色还是黑色

 

其中“0”(ZE),白色(WH),黑色(BL)都是模糊集合,它们的隶属度函数如下:

图3

     其中,“0”集合(ZE)的隶属度函数为

式1

示例:

假设现在有如下领域:

则可计算其领域di值如下(根据图1):

根据式1计算各di属于“0”集合的隶属度u(di)如下:

于是d2属于“0”且d4属于“0”的隶属度为min(u(d2),u(d4)) = 0.78;

同理有:

条件1:d2属于“0”且d6属于“0”的隶属度为wh1=0.78

条件2:d6属于“0”且d8属于“0”的隶属度为wh2=0.78

条件3:d8属于“0”且d4属于“0”的隶属度为wh3=0.87

条件4:d4属于“0”且d2属于“0”的隶属度为wh4=0.78

由于前四个条件只需满足一个条件,输出即为“白色”(WH),故现用or语句将前四个条件连接,假设其为条件a

        wh=max(wh1,wh2,wh3,wh4)=0.87

条件b:前四个条件都不满足:

        bl=1-wh=0.13

因为输出灰度属于“白色”的隶属度函数u(v)如下(见图3,WH线):

于是,条件A:同时满足前四个条件,并且输出灰度为“白色”,的输出为

Q(1)=min(wh,u(v)),如下图:

同理,条件B:满足条件5,且输出灰度属于“黑色”,的输出为:

Q(2)=min(bl,u(v)),如下图:

于是,全部输出为条件A或者条件B,即

Q = max(Q(1),Q(2)),如下图:

图10

最后,我们对输出进行去模糊,即最终输出V0:

式2

其中,v = 0,1,2.....L-1,即K=L-1

将图10代入式2得

v0=174.405

代码:

VS2013+OpenCV3.0代码如下:

/*
***************************************************************************************************************************************
-----------------------------------------------作者:我三食堂不服----------------------------------------------------------------------
***************************************************************************************************************************************
*/


#include <opencv2/opencv.hpp>  
#include <math.h>
#include <vector>

using namespace std;
using namespace cv;


/*
//模糊集合的边缘检测
//isUnify - 是否标定(仅在位深度为8时有效),false - 梯度值小于0时置0,大于255时置为255,true - 梯度值拉伸到0 ~ 255内
*/
int FuzzyEdge(const Mat &input, Mat &out, bool isUnify = false);




int main(int argc, char** argv)
{
	Mat im_source;				//原图
	Mat im_pro1;				//处理后的图片
	Mat im_pro2;				//处理后的图片

	//载入原图(灰度图方式)
	im_source = imread("3-59_a.tif", IMREAD_GRAYSCALE);

	//图片处理
	FuzzyEdge(im_source, im_pro1);
	FuzzyEdge(im_source, im_pro2, true);

	//创建窗口
	namedWindow("【原图】");
	namedWindow("【处理后1】");
	namedWindow("【处理后2】");

	//显示图片
	imshow("【原图】", im_source);
	imshow("【处理后1】", im_pro1);
	imshow("【处理后2】", im_pro2);

	//保存图片
	imwrite("3-59_b.tif", im_pro1);
	imwrite("3-59_c.tif", im_pro2);

	//等待键盘操作
	cvWaitKey(0);

	return 0;
}



/*
//模糊集合的边缘检测
//isUnify - 是否标定(仅在位深度为8时有效),false - 梯度值小于0时置0,大于255时置为255,true - 梯度值拉伸到0 ~ 255内
*/
int FuzzyEdge(const Mat &input, Mat &out, bool isUnify)
{
	double kernel[4];					// 领域灰度差\隶属度
	double WH[256], BL[256];			// 颜色隶属度函数
	double wh1, wh2, wh3, wh4, wh, bl;	// 各条件对应白色(黑色)隶属度
	double Q, MQ;						// 输出模糊集合的隶属度、隶属度总和
	Mat extend;							// 对输入图像进行拓展
	Mat out_f;							// 输出图像
	uchar* data_extend;					// 拓展的图像像素数据	
	uchar* data_out;					// 输出图片像素数据
	long double data;					// 灰度值
	int h{ input.rows };				// 图片高
	int w{ input.cols };				// 图片宽
	int w2{ w + 2 };					// 拓展图片宽
	int h2{ h + 2 };					// 拓展图片高
	int u, v, i;						// 循环变量

	//参数输入错误
	if (h < 3 || w < 3)
		return 0;

	//拓展图像
	copyMakeBorder(input, extend, 1, 1, 1, 1, BORDER_REFLECT_101);
	data_extend = extend.data;

	//输出图像初始化
	out.release();
	out.create(h, w, input.type());
	out_f.create(h, w, CV_32FC1);
	data_out = out.data;

	//颜色隶属度函数初始化
	for (i = 0; i < 256; i++)
	{
		if (i < 204)
			BL[i] = (204.0 - i) / 204.0;
		else
			BL[i] = 0;

		if (i>51)
			WH[i] = (i - 51.0) / 204.0;
		else
			WH[i] = 0;
	}


	//进行边缘增强
	for (v = 1; v < h2 - 1; v++)
	for (u = 1; u < w2 - 1; u++)
	{
		//计算灰度差(即d2,d4,d6,d8)
		kernel[0] = data_extend[(v - 1)*w2 + u] - data_extend[v*w2 + u];
		kernel[1] = data_extend[(v)*w2 + u - 1] - data_extend[v*w2 + u];
		kernel[2] = data_extend[(v)*w2 + u + 1] - data_extend[v*w2 + u];
		kernel[3] = data_extend[(v + 1)*w2 + u] - data_extend[v*w2 + u];

		//计算d2,d4,d6,d8四个灰度差属于
		//“灰度差为0”集合
		//的隶属度
		for (i = 0; i < 3; i++)
		{
			kernel[i] /= 255;
			kernel[i] = exp(-40 * kernel[i] * kernel[i]);
		}

		//计算各像素属于
		//“di和dj同时为0”集合(i,j=2、4、6、8)
		//的隶属度
		wh1 = min(kernel[0], kernel[1]);
		wh2 = min(kernel[0], kernel[2]);
		wh3 = min(kernel[3], kernel[1]);
		wh4 = min(kernel[3], kernel[2]);

		//计算各像素属于
		//“d2,d4,d6,d8全为0”集合
		//的隶属度
		wh = max(max(wh1, wh2), max(wh3, wh4));

		//计算各像素属于
		//“满足第5个条件”集合
		//的隶属度
		bl = 1 - wh;

		//计算输出灰度(重心)
		data = 0;
		MQ = 0;
		for (i = 0; i < 256; i++)
		{
			Q = max(min(BL[i], bl), min(WH[i], wh));
			data += i*Q;
			MQ += Q;
		}
		data /= MQ;
		out_f.at<float>(v - 1, u - 1) = (float)data;
	}

	//图像格式转换
	if (isUnify)
	{
		double max, min, size, k;
		minMaxIdx(out_f, &min, &max);
		size = max - min;
		k = 255 / size;

		for (v = 0; v < h; v++)
		for (u = 0; u < w; u++)
		{
			data_out[v*w + u] = (uchar)(k*(out_f.at<float>(v, u) - min));
		}
	}
	else
	{
		for (v = 0; v < h; v++)
		for (u = 0; u < w; u++)
		{
			data = out_f.at<float>(v, u);
			if (data < 0)
				data = 0;
			else if (data>255)
				data = 255;

			data_out[v*w + u] = (uchar)data;
		}
	}

	return 0;
}

运行效果:
 

原图
效果图
对效果图进行标定的结果

 

2019-10-14 09:12:37 weixin_35732969 阅读数 739

举个例子:

假设我们要根据颜色将某水果分成3类:生的,半熟的和成熟的。假设经过观察得出如下结论:生的水果是绿色,半数的是黄色,成熟的是红色。标志绿黄红是颜色感觉的含混描述,要用模糊形式表达,可通过隶属度定义颜色(光的波长)的函数实现。输入的隶属度函数如下图:

上面提到的颜色和成熟度关系的知识可用下面的IF-THEN模糊规则给出:

IF-THEN规则中,THEN左侧部分称为前提条件),右侧部分称为后果结论)。

下一步,我们要寻找一种使用输入(颜色)和由IF-THEN规则描述的知识基础来创建模糊系统的输出方法。这一处理称为推断推理

我们处理的输出本身也是模糊的,必须定义输出的隶属度函数,如下图:

比较两幅图发现,输入输出的隶属度函数的自变量是不同的,一个是颜色,一个是成熟度。如果把两个隶属度函数以及基础规则结合起来看,结果将是二维的。例如”红色AND成熟“的表达,见下图:

根据模糊集合的定义,AND定义为两个隶属度函数的最小,即:

\mu _{3}(z,v) = min\{\mu_{red}(z),\mu_{mat}(v)\}

下标3表示基础知识中规则R_{3}的结果。上式是两个隶属度函数的通解,我们感兴趣的是特定输入的输出结果。令z_{0}表示红色的一个特定值,则在\mu _{red}(z_{0})\mu _{3}(z,v)间执行AND操作,并在z_{0}处求值,可得到规则R_{3}下的特定输入对应的输出:

Q_{3}(v) = min\{\mu_{red}(z_{0}),\mu_{3}(z_{0},v)\}

Q_{3}(v)表示规则3和一个特定输入导致的模糊输出Q_{3}中的唯一变量是所期望的输出变量v。

对于上式,分步来看。首先,\mu_{red}(z_{0})是一个常数,一个常数与\mu_{3}(z,v)做最小操作,相当于截取掉\mu_{3}(z,v)的顶部;其次,我们只对沿颜色轴的一个值z_{0}感兴趣(即\mu_{3}(z_{0},v)),相当于沿着成熟轴截取一个剖面,该剖面位于z_{0}处,见下图:

同理,可得到由其他两个规则和特定输入导致的模糊响应:

Q_{2}(v) = min\{\mu_{yellow}(z_{0}),\mu_{2}(z_{0},v)\} 

Q_{1}(v) = min\{\mu_{green}(z_{0}),\mu_{1}(z_{0},v)\}

前面定义的3个规则是用OR连接的,所以,全部模糊输出如下:

Q = Q_{1} \mathbf{OR} Q_{2} \mathbf{OR} Q_{3}

OR写成最大操作的形式:

Q(v) = \max_{r}\{\min_{s}\{\mu_{s}(z_{0}),\mu_{r}(z_{0},v)\}\}

其中,r = {1,2,3},s = {绿色,黄色,红色}。上式是通用的,可以将其扩展到n个规则,可令r = {1,2,3,...,n};类似的可以把s扩展到包含任何有限数量的隶属度函数。

下图是对上面讨论的内容的一个总结。图(a)显示了在z_{0}处计算的3个隶属度函数。图(b)显示了对输入z_{0}的响应输出,这些模糊集合是上面图3.50(b)裁剪后的剖面,其中Q_{1}由所有的0组成,因为\mu_{green}(z_{0})=0。图(c)则是Q_{1},Q_{2},Q_{3}的并集。

目前为止,我们得到了特定输入的完整输出,但它仍是个模糊集合。下一步称为去模糊:从模糊集合Q中得到”干脆的“输出v_{0}。去模糊常用的方法是计算该集合的重心。如果Q(v)有K种可能的值Q(1),Q(2),...,Q(K),则其重心为:

v_{0} = \frac{\sum_{v=1}^{K}vQ(v)}{\sum_{v=1}^{K}Q(v)}

从而得到一个”干脆的“输出。

下面,我们考虑规则中有多条件的情况,例如有一个规则:IF颜色是红色OR坚固性是软的,THEN水果是成熟的。此时除了定义颜色的隶属度函数,还需定义坚固性的隶属度函数。下图显示这种多条件的情况,并且把基于规则的模糊逻辑使用步骤总结如下:

补充:

当变量数很大时,常用方便的表示方法(变量,模糊集合)将一个变量和其对应的隶属度函数配对。例如,规则IF颜色是绿的,THEN水果是生的,在这里可以写成IF(z,绿色)THEN(v,生的),z和v表示颜色和成熟度,绿色和生的分别由隶属度函数\mu_{green}(z),\mu_{verd}(v)定义的两个模糊集合。

当处理M个IF-THEN规则,N个输入变量z_{1},z_{2},...,z_{N}和一个输出变量v,在图像中常用的规则公式如下:

\begin{matrix} \mathbf{IF}(z_{1},A_{11})\mathbf{AND}(z_{2},A_{12})\mathbf{AND}...\mathbf{AND}(z_{N},A_{1N})\mathbf{THEN}(v,B_{1})\\ \mathbf{IF}(z_{1},A_{21})\mathbf{AND}(z_{2},A_{22})\mathbf{AND}...\mathbf{AND}(z_{N},A_{2N})\mathbf{THEN}(v,B_{2})\\ \mathbf{...}\\ \mathbf{IF}(z_{1},A_{M1})\mathbf{AND}(z_{2},A_{M2})\mathbf{AND}...\mathbf{AND}(z_{N},A_{MN})\mathbf{THEN}(v,B_{M})\\ \mathbf{ELSE}(v,B_{E}) \end{matrix}

这里假设条件之间是AND连接。A_{ij}是与第i个规则和第j个输入变量相关联的模糊集合,B_{i}是与第i个规则相关联的模糊集合。

必须计算每个规则的条件的所有元素,因为这里假设是AND连接,所以使用min操作,计算第i个规则的条件产生一个标量输出\lambda_{i}

\lambda_{i} = \min\{\mu_{A_{ij}}(z_{j});j=1,2,...,N\}

\lambda_{i}称为第i个规则的强度水平(或点火水平),用于剪切第i个规则的输出函数的一个值。

THEN规则的条件很难满足时,执行ELSE规则。ELSE规则的强度水平如下:

\lambda_{E} = \min\{1-\lambda_{i};i=1,2,...,M\}

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

以对比度增强为例,可以用如下的规则说明对比度增强的过程:

IF 一个像素是暗的,THEN 使它较暗;

IF 一个像素是灰的,THEN 使它仍是灰的;

IF 一个像素是亮的,THEN 使它较亮。

输入输出的隶属度函数如下:

输出隶属度函数我们处理的是常数,如我们可以选择:v_{d} = 0(黑),v_{g} = 127(灰),v_{b} = 255(白)。对于任意的输入z_{0},输出v_{0}用前面的重心公式求:

v_{0} = \frac{\mu_{dark}(z_{0})*v_{d}+\mu_{grey}(z_{0})*v_{g}+\mu_{bright}(z_{0})*v_{b}}{\mu_{dark}(z_{0})+\mu_{grey}(z_{0})+\mu_{bright}(z_{0})}

微信交流
多谢打赏

参考资料:冈萨雷斯《数字图像处理》

相关博文:图像处理之模糊集合原理

2018-02-28 10:32:18 zhengxiaoyang995926 阅读数 313

基本逻辑操作:属于,包含,交差并补等。(

灰度图像的集合操作:灰度值的并集操作和交集操作通常分别定义为相应像素对的最大和最小,而补集操作定义为常数与图像中每个像素的灰度间的两两之差。

如:灰度级图像的元素用集合A表示,其中元素是三元组形式(x,y,z),x与y为空间坐标,z为灰度。补集:

Ac={(x, y, K-z)|(x, y, z)∈A};

其中K = 2k - 1,k为表示z的灰度的比特数。

A= Ac={(x, y, 255-z)|(x, y, z)∈A};

同理,两个灰度集合A和B的并集可定义为集合

A∪B = {max(a, b)|a∈A, b∈B};

灰度图像的逻辑操作:AND, OR, NOT, XOR(略)。

模糊集合:举个栗子

U代表所有的人,令AU的子集,为年轻人的集合。引入隶属度函数对U中每个元素赋值。隶属度函数简单地定义为一个阈值,低于该阈值的为年轻人,高于该阈值的为非年轻人。思考:假设20岁为阈值,20岁为年轻人,20岁零一秒就不是年轻人了?所以需要更多的灵活性,即从年轻到非年轻过渡。使用模糊集合可以声明一个人的年轻度为50%。换句话说,年龄是一个不精确的概念,而模糊逻辑提供处理这种概念的工具。

相关链接:http://www.cnblogs.com/MrZheng9511/p/zheng3.html

2019-10-14 09:14:08 weixin_35732969 阅读数 802

举个例子:

我们习惯处理的集合是一种“干脆的”集合,成员要么属于这个集合(真或1),要么不属于(假或0)。例如,用Z表示所有人员的集合,我们想要定义一个“年轻人”的子集A。我们需要一个隶属度函数q,它对Z中每一个成员z赋值0或1。另外我们需要一个阈值,等于或小于该阈值的人考虑为年轻人,大于则考虑为非年轻人。下图用20岁的阈值给出了这一“干脆的”集合:

这样一个“干脆的”集合的问题或者说是不合理的地方是:年龄20岁是年轻人,只要20岁零1秒就不再是年轻人。我们希望的是年轻和非年轻之间能渐进的过渡。下图给出了另一种划分可能性:

上图允许有年轻的程度,如一个50%年轻的人位于斜坡的中间,曲线的斜率引入什么是“年轻”的更加模糊的概念。

定义:令Z为元素集,z表示Z的一类元素,即Z = {z}。Z中的模糊集合A由隶属度函数\mu _{A}(z)表征,它是与Z的元素相关的在区间[0,1]内的一个实数。\mu _{A}(z)在z处的值表示A中z的隶属度等级,\mu _{A}(z) = 1的所有z都是集合的完全成员,\mu _{A}(z)=0的所有z都不是集合的成员,而\mu _{A}(z)的值介于0和1之间的所有z是集合的部分成员。因此,模糊集合是一个由z值和相应的隶属度函数组成的序对:

A = \{z,\mu _{A}(z)|z\in Z\}

年龄限制为整数年时,根据上面第二幅图,则有:

A = {(1,1),(2,1),(3,1),...,(20,1),(21,0.9),(22,0.8),...,(25,0.5),(26,0.4),...,(29,0.1)}

空集:当且仅当Z中的隶属度函数等于0。

相等:模糊集合A和B相等,当且仅当对所有的z\in Z\mu _{A}(z) = \mu_{B}(z)

补集:由\bar{A}或NOT(A)表示模糊集合A的补集,定义为其隶属度函数是\mu_{\bar{A}}(z) = 1-\mu_{A}(z)的集合。

子集:模糊集合A是模糊集合B的子集,当且仅当对于所有的z\in Z\mu_{A}(z)\leqslant \mu_{B}(z)

并集:两个模糊集合A和B的并集,具有隶属度函数\mu_{U}(z) = max[\mu_{A}(z),\mu_{B}(z)],表示为A\cup B或A OR B。

交集:两个模糊集合A和B的交集,具有隶属度函数\mu_{I}(z) = min[\mu_{A}(z),\mu_{B}(z)],表示为A\cap B或A AND B。

交并补的定义可用如下的图表示:

注:模糊逻辑和概率均在区间[0,1]上,但有明显的区别。以最开始的例子为例,概率的说法可能是“一个人年轻的可能性是50%”,而模糊逻辑的说法可能是“一个人在年轻人集合中的隶属度等级是0.5”。第一种说法中,我们有50%的机会知道这个人在不在年轻人的集合里。第二种说法说的是一个人的年轻程度是0.5,或者说这是一个“平均的”年轻人:不是真年轻,但也不是不年轻。模糊逻辑完全不是概率,它仅处理一个集合中隶属度等级。模糊逻辑在由含混和不精确而不是随机性表征的应用中找到了用途

一些常用的隶属度函数:

微信交流
多谢打赏

参考资料:冈萨雷斯《数字图像处理》

2019-05-18 10:30:28 yishi_c 阅读数 162

版权声明:以下图片截取自《数字图像处理》冈萨雷斯 一书中。

使用模糊技术进行灰度变换和空间滤波

模糊集合:一个由z值和(赋予z成员等级的)相应隶属度函数组成的序对,即
在这里插入图片描述

1.模糊集合论原理

集合的定义:
补集(NOT):在这里插入图片描述
并集(OR):在这里插入图片描述
交集(AND):
在这里插入图片描述
一些常用的隶属度函数:
在这里插入图片描述
其函数图像如下图所示:

基于规则的模糊逻辑应用的主要步骤:
在这里插入图片描述
在这里插入图片描述

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

应用:增强对比度,同时保持图像中的部分细节。
灰度级图像对比度增强过程的规则:
在这里插入图片描述
基于规则的对比度增强处理,得到隶属度函数:
在这里插入图片描述

对任何输入(z0),输出(v0)的表达式为(由隶属度函数组成):
在这里插入图片描述
模糊图像处理的计算量很大,因为全部模糊处理、所有规则的前提、推断、聚集和去模糊,都必须应用到输入图像中的每个像素。使用上式,可以简化推断、聚集和去模糊,可有效地减少计算需求。

3.使用模糊集合进行空间滤波

应用:图像锐化(边缘增强)、图像分割。
定义一个领域特性,,该特性”截获“滤波器支持检测的本质。
基于模糊集合概念的边缘提取算法:如果一个像素属于平滑区,则令其为白色,否则使其为黑色;其中”黑色“和”白色“是模糊集合。
定义:zi表示像素邻域点;di表示第i个邻点和中心点间的灰度差(di=zi-z5)。如下图描述:
在这里插入图片描述
四个IF-THEN规则和一个ELSE规则:
在这里插入图片描述

没有更多推荐了,返回首页