#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include "SamFL.h"
#define DIF_NEG 0
#define DIF_POS 1
#define NOT_EDGE 0
#define EDGE 1
double edge_maxima[] = { 0 ,255 };
double edge_thresh;
int trackbar_value=20;
IplImage* grnt;
IplImage* edge;
double isEdge(double x , double *val)
{
double GrayDifNeg[8];
double GrayDifPos[8];
double Edge[2];
double Q[8];
double r[8];
int i;
for(i =0; i<8;i++){
Q[i]=val[i]-x;//算出Gray_Dif(i)
/* 计算出Membership Function */
GrayDifNeg[i]=sfl_fuzzyfier_s(Q[i], -255.0,edge_thresh);
GrayDifPos[i]=sfl_fuzzyfier_s(Q[i], edge_thresh, 255.0);
}
// Rules
r[0]=sfl_and(sfl_and(sfl_and(GrayDifNeg[0],GrayDifNeg[1]),GrayDifNeg[7]),sfl_and(sfl_and(GrayDifPos[3],GrayDifPos[4]),GrayDifPos[5]));
r[1]=sfl_and(sfl_and(sfl_and(GrayDifPos[0],GrayDifPos[1]),GrayDifPos[7]),sfl_and(sfl_and(GrayDifNeg[3],GrayDifNeg[4]),GrayDifNeg[5]));
r[2]=sfl_and(sfl_and(sfl_and(GrayDifNeg[1],GrayDifNeg[2]),GrayDifNeg[3]),sfl_and(sfl_and(GrayDifPos[5],GrayDifPos[6]),GrayDifPos[7]));
r[3]=sfl_and(sfl_and(sfl_and(GrayDifPos[1],GrayDifPos[2]),GrayDifPos[3]),sfl_and(sfl_and(GrayDifNeg[5],GrayDifNeg[6]),GrayDifNeg[7]));
r[4]=sfl_and(sfl_and(sfl_and(GrayDifNeg[2],GrayDifNeg[3]),GrayDifNeg[4]),sfl_and(sfl_and(GrayDifPos[0],GrayDifPos[7]),GrayDifPos[6]));
r[5]=sfl_and(sfl_and(sfl_and(GrayDifPos[2],GrayDifPos[3]),GrayDifPos[4]),sfl_and(sfl_and(GrayDifNeg[0],GrayDifNeg[7]),GrayDifNeg[6]));
r[6]=sfl_and(sfl_and(sfl_and(GrayDifNeg[0],GrayDifNeg[1]),GrayDifNeg[2]),sfl_and(sfl_and(GrayDifPos[4],GrayDifPos[5]),GrayDifPos[6]));
r[7]=sfl_and(sfl_and(sfl_and(GrayDifPos[0],GrayDifPos[1]),GrayDifPos[2]),sfl_and(sfl_and(GrayDifNeg[4],GrayDifNeg[5]),GrayDifNeg[6]));
/* 计算边界 */
Edge[EDGE]=sfl_or(r[0],sfl_or(r[1],sfl_or(r[2],sfl_or(r[3],sfl_or(r[4],sfl_or(r[5],sfl_or(r[6],r[7])))))));
Edge[NOT_EDGE]=sfl_not(Edge[EDGE]);
/* 解模糊 */
return sfl_defuzzyfier_coa(2,Edge,edge_maxima);
}
IplImage* FuzzyEdge(IplImage* image, float thresh )
{
IplImage *gray, *edge;
gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray, CV_BGR2GRAY);//将图像转化为灰度图像
cvZero(edge);
cvNot( gray, edge );
uchar *data= (uchar *)gray->imageData;
uchar *Edata= (uchar *)edge->imageData;
int height = gray->height;
int width = gray->width;
int step = gray->widthStep;
double in[8];
edge_thresh=thresh;
int i,j;
for(i=1;i<height-1;i++){
for(j=1;j<width-1;j++){
/* 取出Q点的周围的八个点的灰度值 */
in[0]=data[(i-1)*step+(j+1)];//点7
in[1]=data[(i-1)*step+(j)];//点8
in[2]=data[(i-1)*step+(j-1)];//点1
in[3]=data[(i)*step+(j-1)];//点2
in[4]=data[(i+1)*step+(j-1)];//点3
in[5]=data[(i+1)*step+(j)];//点4
in[6]=data[(i+1)*step+(j+1)];//点5
in[7]=data[(i)*step+(j+1)];//点6
/* 然后有isEdge算出是否为边缘,传入参数第一个是Q点的灰度值,
* 第二个是周围八个点的灰度值*/
Edata[i*step+j]=isEdge(data[(i)*step+(j)],in);
}
}
cvReleaseImage( &gray );
return edge;
}
void on_trackbar(int pos)
{
edge=FuzzyEdge(grnt,trackbar_value-20);
/* FuzzyEdge是主要处理函数 */
cvShowImage("Fuzzy Edge", edge);
cvReleaseImage( &edge );
}
int main()
{
char Buf[512];
/* 先取得图片名称 */
puts("Enter Image File Name :");
gets(Buf);
/* 装载图片 */
grnt = cvLoadImage(Buf,1);
if(grnt){
cvNamedWindow("Orginal Image", 0);
cvShowImage("Orginal Image", grnt);
cvNamedWindow("Fuzzy Edge", 0);
cvCreateTrackbar( "Threshold", "Fuzzy Edge", &trackbar_value, 40, on_trackbar );
on_trackbar(0);
cvWaitKey(0);
cvDestroyWindow( "Orginal Image" );
cvReleaseImage( &grnt );
cvDestroyWindow( "Fuzzy Edge" );
return 0;
}
else{
puts("I can not open Image File !!! :( ");
cvWaitKey(0);
return -1;
}
}
该程序使用的模糊逻辑库SamFl和源程序,以及依据理论的paper在如下地址:
http://blogimg.chinaunix.net/blog/upfile2/090113090453.gz
分享到:
相关推荐
《OpenCV教程——基础篇》刘瑞祯 实例源代码。有注释,project,范例代码齐全。
OpenCV教程——基础篇3,于仕琪著,这两天正在学习
OpenCV教程——基础篇,于仕琪著,这两天正在学习
OpenCV教程——基础篇1/3,于仕琪著,这两天正在学习。
opencv教程——基础篇书籍的第四章第五章部分的示例代码
OpenCV教程——基础篇 作者:刘瑞祯 于仕琪 机器视觉方面的书,很不错。
OpenCV教程——基础篇.part1 作 者:于仕琪 刘瑞祯 编著
opencv教程——基础篇书籍第五章的部分实例代码
OpenCV教程——基础篇(刘瑞祯 于仕琪)---源代码
opencv教程——基础篇书籍中的第二章的示例代码
目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
这是非常实用的基于OpenCV的源码,包括模糊、腐蚀和边缘检测等部分,后续会继续更新,请大家继续关注!!
一本介绍OpenCV的基础图书,对OpenCV开放源代码计算机视觉库进行的详细讲解
含实例、图片及程序代码,还有于仕琪的幻灯片讲义
《OpenCV基础教程》一书的光盘 ...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
这是于老师出的关于opencv 的第一版书,讲的很细,值得初学者学习。
OpenCV教程基础篇 电子书 pdf 作者:刘瑞祯 于仕琪 本书是国内第一本全面介绍OpenCV的中文版图书,对OpenCV开放源代码计算机视觉库进行了详细讲解。
penCV教程——基础篇.part2 作 者:于仕琪 刘瑞祯 编著
书中的C/C++语言实例。各实例子目录中的*.dsw和*.dsp文件分别为Windows下Visual C++ 6.0的Workspace文件和Project文件;Makefile是Linux下GNU Make的输入文件。在Windows环境下,双击*.dsw文件将会启动Visual C++ ...