#include <math.h>
#include <iostream>
#include <string.h>
#include "matrix.h"
#include <time.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include "imageBase.h"
#include "image.h"
IMAGE_t *mvCanny(IMAGE_t * src,int smoothSize,float sigma,int winSize,float threshH,float threshL)
{
IMAGE_t *imgSmooth = NULL;
short *dx = (short *)malloc(src->imageSize * sizeof(short));
short *dy = (short *)malloc(src->imageSize * sizeof(short));
float *mag = (float *)malloc(src->imageSize * sizeof(float));
float *ang = (float *)malloc(src->imageSize * sizeof(float));
float *edge = (float *)malloc(src->imageSize * sizeof(float));
int i,j;
int index,width = src->width,height = src->height;
IMAGE_t *dst = mvCreateImage(src->width,src->height,src->depth,1);
IMAGE_t *edgeImgH = mvCreateImage(src->width,src->height,src->depth,1);
IMAGE_t *edgeImgL = mvCreateImage(src->width,src->height,src->depth,1);
imgSmooth = mvGaussSmooth(src,smoothSize,sigma);
mvSoble(imgSmooth->imageData,dx,dy,src->width,src->height,1);
for(i = 0;i < src->imageSize;i++)
{
mag[i] = (float)(dx[i] * dx[i] + dy[i] * dy[i]);
if(fabs((float)dx[i]) < 0.00001f)
{
if(dy[i] > 0)
ang[i] = 90.0f;
else if(dy[i] < 0)
ang[i] = -90.0f;
else
ang[i] = 0.0f;
}
else
ang[i] = atan((float)dy[i]/dx[i]);
}
for (int row = 0; row < src->height; row++)
{
for (int col = 0; col < src->width; col++)
{
index = row * width + col;
float angle = ang[index];
float m0 = mag[index];
edge[index] = m0;
if(angle >=0 && angle < 22.5) // angle 0
{
float m1 = mag[index - width];
float m2 = mag[index + width];
if(m0 < m1 || m0 < m2)
{
edge[index] = 0;
}
}
else if(angle >= 22.5 && angle < 67.5) // angle +45
{
float m1 = mag[index + width - 1];
float m2 = mag[index - width + 1];
if(m0 < m1 || m0 < m2)
{
edge[index] = 0;
}
}
else if(angle >= 67.5 && angle < 112.5) // angle 90
{
float m1 = mag[index + 1];
float m2 = mag[index - 1];
if(m0 < m1 || m0 < m2)
{
edge[index] = 0;
}
}
else if(angle >=112.5 && angle < 157.5) // angle 135 / -45
{
float m1 = mag[index - width - 1];
float m2 = mag[index + width + 1];
if(m0 < m1 || m0 < m2)
{
edge[index] = 0;
}
}
else if(angle >=157.5)
{
float m1 = mag[index + width];
float m2 = mag[index - width];
if(m0 < m1 || m0 < m2)
{
edge[index] = 0;
}
}
}
}
for(i = 0;i < src->imageSize;i++)
{
if(edge[i] > threshH)
edgeImgH->imageData[i] = 255u;
if(edge[i] > threshL)
edgeImgL->imageData[i] = 255u;
}
while(1)
{
int startx,starty;
int flagStart = 0;
for (i = 0; i < src->height; i++)
{
for (j = 0; j < src->width; j++)
{
if(edgeImgH->imageData[i * src->width + j])
{
dst->imageData[i * src->width + j] = 255u;
edgeImgH->imageData[i * src->width + j] = 0;
startx = j;
starty = i;
i = src->height;
j = src->width;
flagStart = 1;
}
}
}
for(;;)
{
int pad = winSize >> 1;
int flag = 0;
for (i = startx - pad; i < startx + pad; i++)
{
for (j = starty - pad; j < starty + pad; j++)
{
if(i < 0 || j < 0)
continue;
if(edgeImgH->imageData[i * src->width + j])
{
dst->imageData[i * src->width + j] = 255u;
edgeImgH->imageData[i * src->width + j] = 0;
startx = j;
starty = i;
flag = 1;
}
if(edgeImgL->imageData[i * src->width + j])
{
dst->imageData[i * src->width + j] = 255u;
edgeImgL->imageData[i * src->width + j] = 0;
}
}
}
if(flag == 0)
break;
}
if(flagStart == 0)
break;
}
free(dx);
free(dy);
free(mag);
free(ang);
free(edge);
mvReleaseImage(&edgeImgH);
mvReleaseImage(&edgeImgL);
return dst;
}
基于canny的边沿检测源码(纯C语言,不调用opencv)
最新推荐文章于 2024-07-24 17:46:08 发布