索貝爾(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進行顯示