`
xiaoer_1982
  • 浏览: 1865379 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

OpenCV学习——Fuzzy Logic模糊逻辑边缘提取

阅读更多

#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教程——基础篇2

    OpenCV教程——基础篇,于仕琪著,这两天正在学习

    《OpenCV教程——基础篇》刘瑞祯 实例源代码

    刘瑞祯的《OpenCV教程——基础篇》是一本面向初学者的优秀教材,旨在帮助读者快速掌握OpenCV的基础知识和实践技巧。这本书的实例源代码提供了丰富的实践案例,有助于读者深入理解理论概念。 本教程覆盖了OpenCV的...

    OpenCV教程——基础篇.part1

    OpenCV教程——基础篇.part1 作 者:于仕琪 刘瑞祯 编著

    OpenCV教程——基础篇3

    标题“OpenCV教程——基础篇3”表明本文内容是关于计算机视觉库OpenCV(Open Source Computer Vision Library)的入门级教程的第三部分。OpenCV是一个开源的计算机视觉和机器学习软件库,由超过47,000个优化的算法...

    OpenCV教程——基础篇(刘瑞祯 于仕琪)---源代码

    OpenCV教程——基础篇(刘瑞祯 于仕琪)---源代码

    OpenCV教程——基础篇(第一版)

    标题:“OpenCV教程——基础篇(第一版)”的知识点 描述:本书是于老师所著,主要针对初学者,对OpenCV进行了细致的讲解,是一本值得学习的教材。 标签:OpenCV OpenCV是一个开源的计算机视觉和机器学习软件库,...

    OpenCV教程——基础篇1

    由于文件内容中存在大量OCR扫描图片,无法直接提供文字内容,但我可以根据标题、描述和标签提供一些关于“OpenCV教程——基础篇1”的知识点。 OpenCV是一个开源的计算机视觉和机器学习软件库,由英特尔公司发起并...

    OpenCV教程——基础篇 part1

    目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。

    OpenCV教程——基础篇 part2

    目前,OpenCV逐步成为一个通用的基础研究...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。

    OpenCV教程——基础篇

    一本介绍OpenCV的基础图书,对OpenCV开放源代码计算机视觉库进行的详细讲解

    OpenCV教程——基础篇(2)(共3)

    **OpenCV教程——基础篇(2)** OpenCV(开源计算机视觉库)是计算机视觉领域广泛应用的开源库,由Intel研发并维护,旨在提供一种高效、灵活的图像处理和计算机视觉算法实现。这本书《OpenCV教程基础篇》由刘瑞祯和于...

    OpenCV教程——基础篇(实例源代码)

    OpenCV,全称为“Open Source Computer Vision Library”,是一款开源的计算机视觉库,广泛应用于图像处理、机器学习和人工智能领域。本教程的基础篇旨在为初学者提供一个深入理解OpenCV基本功能和操作的平台,通过...

    OpenCV教程——基础篇(3)(共3)

    高斯模糊、中值滤波和 Sobel 边缘检测等都是常见的滤波方法。它们用于平滑图像、消除噪声或者提取图像的边缘信息,为特征提取和物体检测提供基础。 此外,OpenCV还提供了丰富的特征检测算法,如SIFT、SURF、ORB等。...

    opencv教程——基础篇实例代码3

    这个“opencv教程——基础篇实例代码3”是针对初学者的教程,旨在帮助读者掌握OpenCV的基本操作和概念。在第五章中,作者通常会讲解图像处理的基础知识,如图像加载、显示、变换以及基本的图像分析技术。 在这个...

    opencv教程——基础篇第二章示例代码

    在这个"opencv教程——基础篇第二章示例代码"中,我们很可能找到如何加载、显示、保存图像,以及进行基本的图像操作,如滤波、色彩空间转换、边缘检测等的代码示例。 1. **图像读取与显示**:OpenCV中的`imread()`...

    openCV教程——基础篇

    含实例、图片及程序代码,还有于仕琪的幻灯片讲义

    OpenCV教程——基础篇光盘

    《OpenCV基础教程》一书的光盘 ...OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。

    opencv教程——基础篇示例代码2

    OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉库,广泛应用于图像分析、机器学习和实时计算机视觉系统。本教程聚焦于OpenCV的基础篇示例代码,主要涵盖第四章和第五章的内容。这些章节通常会涉及图像...

    OpenCV中的腐蚀 、模糊、边缘检测代码

    这是非常实用的基于OpenCV的源码,包括模糊、腐蚀和边缘检测等部分,后续会继续更新,请大家继续关注!!

    OpenCV教程——基础篇.part2

    penCV教程——基础篇.part2 作 者:于仕琪 刘瑞祯 编著

Global site tag (gtag.js) - Google Analytics