Hls平台实现sobel算法(一)

   索贝尔(Sobel)算子主要用于边缘检测,根据像素点的上下、左右邻点的灰度加权差与阈值进行比较,在边缘处达到极值的方法实现边缘检测。

                                                                                                                                                                                                                             -------------序

一、原理性运行

   流水线操作,将输入图像从

(1)、hls::AXIvideo2Mat(INPUT_STREAM, img_0);
(2)、hls::Sobel<1,0,3>(img_0, img_1);
(3)、hls::SubS(img_1, pix, img_2);

(4)、hls::Scale(img_2, img_3, 2, 0);
(5)、hls::Erode(img_3, img_4);
(6)、hls::Dilate(img_4, img_5);
(7)、hls::Mat2AXIvideo(img_5, OUTPUT_STREAM);

第(1)步:

  将图像转换为Mat格式,是3个8位的像素数据,将转换为mat格式的图像命名为img_0,行、场高度为宏定义

第(2)步:

  将转换为mat格式的图像使用Sobel函数进行边缘检测,<1,0,3>分别代表横向检测、纵向检测、检测结果的size,可以为3x3,5x5,7x7。

第(3)步:

   元素级的从数组中间去标量,就是img_1减去输入标量pix(10,10,10)

第(4)步:

    对sobel函数处理完毕的图像进行比例计算,2为乘法因子,0为加法因子,

第(5)步: 第(6)步:

 首先对图像进行膨胀处理,这样边缘更加明显,然后进行侵蚀,作用是滤除毛刺

第(7)步:

   将膨胀、侵蚀的结果转换为AXI形式,这样才能在硬件平台进行传输

二、平台验证

       

int main (int argc, char** argv)
{
    //获取图像数据
    IplImage* src = cvLoadImage(INPUT_IMAGE);
    IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);

    //使用HLS库进行处理
    AXI_STREAM  src_axi, dst_axi;
    IplImage2AXIvideo(src, src_axi);
    hls_sobel(src_axi, dst_axi, src->height, src->width);
    AXIvideo2IplImage(dst_axi, dst);
    cvSaveImage(OUTPUT_IMAGE,dst);
    cvShowImage("hls_dst", dst);

//释放内存 cvReleaseImage(&dst); }

其流程为:

      从头文件中获取输入图像,然后在内存空间中开辟出一块源图像大小的,每个像素占用为数为depth,源通道数目的存储空间。

      然后将图像转为AXIstream格式加载到处理函数中,最后将输出图像dst进行显示

原文地址:https://www.cnblogs.com/luxinshuo/p/11853539.html