首页 文章

Sobel边缘检测,奇怪的输出

提问于
浏览
0

我正在尝试为YUV摄像机流实现Sobel算法进行边缘检测 . 最初看起来很容易,但我不确定这种方法是否正确:

  • 我正在将滤镜应用于Y像素组件并执行U和V = 0(黑白图像) .

  • 之后,为了检查结果,我通过串口发送帧,但是在将图像从YUV转换为jpg之前 .

黑白图像完美运行,我可以在我编写的PC应用程序上看到它,但是当我将Sobel滤镜应用于Y组件时,我得到了这个:
Sobel output

代码:

#define index(xx, yy)  ((yy * width + xx) * 2) & 0xFFFFFFFE  // address multiple of 2

(...............)

for (y=1, y < height-1; y++){
    for (x=1, y < width-1; y++){
        pixel_valueY_h=0.0;
        pixel_valueY_v=0.0;
      for (j= -1; j<2; j++){
         for (i= -1; i<2; i++){

            offset= index(x+1, y+1);
            pixel_valueY_h += (sobel_h[j + 1][i + 1])* input[offset+1]; //offset+1=> Y component
            pixel_valueY_v += (sobel_v[j + 1][i + 1])* input[offset+1]; 

         }
      }
        offset = index(x,y);
        pixel_value= sqrt1((pixel_valueY_h * pixel_valueY_h)+(pixel_valueY_v * pixel_valueY_v));

        if (pixel_value > 255) pixel_value=255;
        if (pixel_value < 0) pixel_value=0;

        //output frame
        output[offset] &=0x00; //U and V components = 0
        output[offset+1] &=(255- (unsigned char)pixel_value );
    }
}

(...............)

关于发生了什么的任何线索?提前致谢 .

1 回答

  • 0

    最后我得到它的工作,问题是使用宏的内存寻址:#define index(xx,yy)((yy * width xx)* 2)&0xFFFFFFFE由于某种原因,它给出了错误的地址 . 相反,我在代码中添加了行(((yy * width xx)* 2)和0xFFFFFFFE,并且像这样(没有修改)完美地工作 .

    谢谢 .

相关问题