2 qq 34614890 qq_34614890 于 2016.05.11 16:37 提问

Sobel边缘检测,为何输出不对呢

//Sobel边缘检测

//卷积
// H 模板高
// W 模板宽
// C模板系数
// CX 中心元素横坐标
// CY 中心元素纵坐标
//fpArray 指向模板数组的指针
//C 模板系数

void Templat( unsigned char *dst,int H, int W, int CX,int CY,int C ,int *Template)

{
IplImage*image;
image = cvLoadImage("1.jpg", 0);
cvNamedWindow("image");
cvShowImage("image", image);
int width = image->width;
int height = image->height;
unsigned char *ptr;

int i, j, k, l;

for (j = CY;j < height - H + CY + 1;j++) 
{
    for (i = CX;i < width - W + CX + 1;i++)
    {

        for (k = 0;k < H;k++)  
        {
            for (l = 0;l < W;l++)
            {
                ptr = (unsigned char*)image->imageData + j*image->widthStep + i;
                ptr = ptr + *((unsigned char *)image->imageData + (j - CY + k)*width + (i - CX + l))*Template[k*W + l];
                dst = (unsigned char*)image->imageData + j*image->widthStep + i;
                *ptr*= C;

                *ptr = abs(*ptr);
                if (*ptr > 255)

                {
                    *dst = 255;
                }
                else 
                {
                    *dst = *ptr;
                }
            }
        }
    }
}

}

//sobel水平与垂直边缘检测

void Sobel(IplImage*image, IplImage*image5)
{
unsigned char*dst,*dst1,*dst2;
int width = image->width;
int height = image->height;
int i, j;
int H=3;//模板高
int W=3;//模板宽
int C=1;//模板系数
int CX=1;//中心元素横坐标
int CY=1;//中心元素纵坐标
int Template[9];

for (j = 0;j < height;j++)
{
    for (i = 0;i < width;i++)
    {

        dst1 = (unsigned char*)image->imageData + j*image->widthStep + i;
        dst2 = (unsigned char*)image->imageData + j*image->widthStep + i;

        }
    }

Template[0] = -1;
Template[1] = -2;
Template[2] = -1;
Template[3] = 0;
Template[4] = 0;
Template[5] = 0;
Template[6] = 1;
Template[7] = 2;
Template[8] = 1;

Templat(dst1,H,W,CX,CY,C,Template);

Template[0] = -1;
Template[1] = 0;
Template[2] = 1;
Template[3] = -2;
Template[4] = 0;
Template[5] = 2;
Template[6] = -1;
Template[7] = 0;
Template[8] = 1;

Templat( dst2,H, W, CX, CY, C,Template);

for (j = 0;j < height;j++)
{
    for(i = 0;i < width;i++)
    {
        dst= (unsigned char*)image5->imageData + j*image5->widthStep + i;

        if (*dst1 < *dst2)
        {
            *dst= *dst2;
        }
        else

        {
            *dst = *dst1;
        }

    }
}

}

void main()
{
IplImage*image, *image1,*image2,*image3,*image4,*image5;
image = cvLoadImage("1.jpg", 0);
cvNamedWindow("image");
cvShowImage("image", image);

image1 = cvCreateImage(cvGetSize(image), image->depth, 1);
image2 = cvCreateImage(cvGetSize(image), image->depth, 1);
image3 = cvCreateImage(cvGetSize(image), image->depth, 1);
image4 = cvCreateImage(cvGetSize(image), image->depth, 1);
image5 = cvCreateImage(cvGetSize(image), image->depth, 1);

Zongxiang(image, image1);
Hengxiang(image, image2);
Shuangxiang(image, image3);
Robert(image, image4);
Sobel(image, image5);


//cvNamedWindow("zongxiang");
//cvShowImage("zongxiang", image1);
//cvNamedWindow("hengxiang");
//cvShowImage("hengxiang", image2);
//cvNamedWindow("shuangxiang");
//cvShowImage("shuangxiang", image3);
//cvNamedWindow("Robert");
//cvShowImage("Robert", image4);
cvNamedWindow("Sobel");
cvShowImage("Sobel", image5);


cvWaitKey();

}

1个回答

qq_34614890
qq_34614890   2016.05.11 16:38

高人在哪里,求助啊

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
sobel算子实现边缘检测及其c++实现及与matlab效果对比
这里增加了对边缘像素的补齐。sobel梯度分割抗噪性好,但是无法做到自动阈值,是其一大遗憾,matlab却解决的很好。 //默认对8位位图进行处理 void Sobel(unsigned char *pIn, int width, int height, unsigned char *pOut) { //每行像素所占字节数,输出图像与输入图像相同 int lineByte=(wid
第六节--基于Sobel的边缘检测C++程序的实现
 /********************************************************************************************************** *函数原型:BOOL CImgProcess::EdgeSobel(CImgProcess* pTo,BYTE bTher,BYTE bEdegType, BOOL bThi
Sobel边缘检测(matlab)
边缘检测是为了将其周围像素灰度有阶跃变化的像素检测出来,这些像素组成的集合就是该图像的边缘。比较常用的边缘检测方法就是考察每个像素在某个领域内灰度的变化,然后利用边缘临近一阶或二阶方向导数变化规律检测边缘,即边缘检测局部算法。 而常用的边缘检测算子有sobel,Roberts,Prewitt,Laplace等等,这里先介绍sobel算子的检测过程。主要的方法就是将图像的每一个点都用sobel算子做卷
Sobel 边缘检测
**Sobel 边缘检测算子**:主要作边缘检测。用于获取数字图像的一阶梯度。 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经纵向向及横向边缘检测的图像,其公式如下: 图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。 ![这里写图片描述](ht
C/C++ OpenCV之Sobel边缘检测
C/C++ OpenCV之Sobel边缘检测
边缘检测(edge detection)_Sobel导数 Laplace算子 Canny边缘检测
写到这里
[图像处理] Sobel边缘检测算法
完成时间:2017/1/23  我的实现结果如下:(图一为原图,图二为边缘检测结果)                                关于Sobel算子(英文部分来源于Wikipedia)          The Sobel operator, sometimes called the Sobel–Feldman operator or Sobel filter,
Sobel算子的边缘检测实现
1. Sobel算子的边缘检测实现 1.1. 边缘检测概念 所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘也是图像匹配的重要的特征。 边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分
基于Sobel和Canny边缘检测
SOBEL CANNY算子学习总结
边缘检测:Sobel算子
.Sobel算子 其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。 Sobel算子包含两