索贝尔(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进行显示