使用Opencv_CUDA 进行滤波操作
邻域处理操作 ==> 滤波操作,拒绝或者允许某特定频段通过 如果图像某处的灰度级变化缓慢,那么就是低频区域,如果灰度级变化剧烈,就是高频区域 邻域滤波即卷积操作 形态学处理:膨胀,腐蚀,开、闭运算
1. 低通滤波
低通滤波可以从图像中删除高频内容。噪声通常被视为高频内容,因此低通滤波器能从图像中消除噪声。 噪声类型有:高斯噪声,均匀噪声,指数噪声与椒盐噪声
1.1 均值滤波
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/cameraman.tif" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_result3x3, d_result5x5, d_result7x7; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filter3x3, filter5x5, filter7x7; filter3x3 = cv:: cuda:: createBoxFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 3 , 3 ) ) ; filter3x3-> apply ( d_img1, d_result3x3) ; filter5x5 = cv:: cuda:: createBoxFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 5 , 5 ) ) ; filter5x5-> apply ( d_img1, d_result5x5) ; filter7x7 = cv:: cuda:: createBoxFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 7 , 7 ) ) ; filter7x7-> apply ( d_img1, d_result7x7) ; cv:: Mat h_result3x3, h_result5x5, h_result7x7; d_result3x3. download ( h_result3x3) ; d_result5x5. download ( h_result5x5) ; d_result7x7. download ( h_result7x7) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Blurred_3x3" , h_result3x3) ; cv:: imshow ( "Blurred_5x5" , h_result5x5) ; cv:: imshow ( "Blurred_7x7" , h_result7x7) ; cv:: imwrite ( "Blurred3x3.png" , h_result3x3) ; cv:: imwrite ( "Blurred5x5.png" , h_result5x5) ; cv:: imwrite ( "Blurred7x7.png" , h_result7x7) ; cv:: waitKey ( ) ; return 0 ;
}
1.2 高斯滤波
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/cameraman.tif" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_result3x3, d_result5x5, d_result7x7; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filter3x3, filter5x5, filter7x7; filter3x3 = cv:: cuda:: createGaussianFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 3 , 3 ) , 1 ) ; filter3x3-> apply ( d_img1, d_result3x3) ; filter5x5 = cv:: cuda:: createGaussianFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 5 , 5 ) , 1 ) ; filter5x5-> apply ( d_img1, d_result5x5) ; filter7x7 = cv:: cuda:: createGaussianFilter ( CV_8UC1, CV_8UC1, cv:: Size ( 7 , 7 ) , 1 ) ; filter7x7-> apply ( d_img1, d_result7x7) ; cv:: Mat h_result3x3, h_result5x5, h_result7x7; d_result3x3. download ( h_result3x3) ; d_result5x5. download ( h_result5x5) ; d_result7x7. download ( h_result7x7) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Blurred with kernel size 3x3" , h_result3x3) ; cv:: imshow ( "Blurred with kernel size 5x5" , h_result5x5) ; cv:: imshow ( "Blurred with kernel size 7x7" , h_result7x7) ; cv:: imwrite ( "gBlurred3x3.png" , h_result3x3) ; cv:: imwrite ( "gBlurred5x5.png" , h_result5x5) ; cv:: imwrite ( "gBlurred7x7.png" , h_result7x7) ; cv:: waitKey ( ) ; return 0 ;
}
1.3 中值滤波
opencv_cuda提供了中值滤波功能,但是比cpu函数要慢 cpu代码实现:
# include <iostream>
# include "opencv2/opencv.hpp" int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/saltpepper.png" , 0 ) ; cv:: Mat h_result; cv:: medianBlur ( h_img1, h_result, 3 ) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Median Blur Result" , h_result) ; cv:: waitKey ( ) ; return 0 ;
}
filter3x3 = cv:: cuda:: createMedianFilter ( CV_8UC1, 3 ) ;
filter3x3-> apply ( d_img1, d_result3x3) ;
2. 高通滤波
高通滤波器可去除图像中的低频成分并增强高频成分,它可以去除低频范围内的背景并且增强属于高频成分的边缘 常用高频滤波器:Sobel、Scharr、Laplacian
2.1 Sobel滤波器
两个检测水平边缘与垂直边缘的核 代码实现:
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp>
# include <opencv2/cudaarithm.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/blobs.png" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_resultx, d_resulty, d_resultxy; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filterx, filtery, filterxy; filterx = cv:: cuda:: createSobelFilter ( CV_8UC1, CV_8UC1, 1 , 0 ) ; filterx-> apply ( d_img1, d_resultx) ; filtery = cv:: cuda:: createSobelFilter ( CV_8UC1, CV_8UC1, 0 , 1 ) ; filtery-> apply ( d_img1, d_resulty) ; cv:: cuda:: add ( d_resultx, d_resulty, d_resultxy) ; cv:: Mat h_resultx, h_resulty, h_resultxy; d_resultx. download ( h_resultx) ; d_resulty. download ( h_resulty) ; d_resultxy. download ( h_resultxy) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Sobel-x derivative" , h_resultx) ; cv:: imshow ( "Sobel-y derivative" , h_resulty) ; cv:: imshow ( "Sobel-xy derivative" , h_resultxy) ; cv:: imwrite ( "sobelx.png" , h_resultx) ; cv:: imwrite ( "sobely.png" , h_resulty) ; cv:: imwrite ( "sobelxy.png" , h_resultxy) ; cv:: waitKey ( ) ; return 0 ;
}
2.2 Scharr 滤波器
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp>
# include <opencv2/cudaarithm.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/blobs.png" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_resultx, d_resulty, d_resultxy; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filterx, filtery; filterx = cv:: cuda:: createScharrFilter ( CV_8UC1, CV_8UC1, 1 , 0 ) ; filterx-> apply ( d_img1, d_resultx) ; filtery = cv:: cuda:: createScharrFilter ( CV_8UC1, CV_8UC1, 0 , 1 ) ; filtery-> apply ( d_img1, d_resulty) ; cv:: cuda:: add ( d_resultx, d_resulty, d_resultxy) ; cv:: Mat h_resultx, h_resulty, h_resultxy; d_resultx. download ( h_resultx) ; d_resulty. download ( h_resulty) ; d_resultxy. download ( h_resultxy) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Scharr-x derivative" , h_resultx) ; cv:: imshow ( "Scharr-y derivative" , h_resulty) ; cv:: imshow ( "Scharr-xy derivative" , h_resultxy) ; cv:: imwrite ( "scharrx.png" , h_resultx) ; cv:: imwrite ( "scharry.png" , h_resulty) ; cv:: imwrite ( "scharrxy.png" , h_resultxy) ; cv:: waitKey ( ) ; return 0 ;
}
2.3 Laplacian 滤波
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp>
# include <opencv2/cudaarithm.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/blobs.png" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_result1, d_result3; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filter1, filter3; filter1 = cv:: cuda:: createLaplacianFilter ( CV_8UC1, CV_8UC1, 1 ) ; filter1-> apply ( d_img1, d_result1) ; filter3 = cv:: cuda:: createLaplacianFilter ( CV_8UC1, CV_8UC1, 3 ) ; filter3-> apply ( d_img1, d_result3) ; cv:: Mat h_result1, h_result3; d_result1. download ( h_result1) ; d_result3. download ( h_result3) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Laplacian Filter 1" , h_result1) ; cv:: imshow ( "Laplacian Filter 3" , h_result3) ; cv:: imwrite ( "laplacian1.png" , h_result1) ; cv:: imwrite ( "laplacian3.png" , h_result3) ; cv:: waitKey ( ) ; return 0 ;
}
3. 形态学处理
# include <iostream>
# include "opencv2/opencv.hpp"
# include <opencv2/cudafilters.hpp>
# include <opencv2/cudaarithm.hpp> int main ( )
{ cv:: Mat h_img1 = cv:: imread ( "images/blobs.png" , 0 ) ; cv:: cuda:: GpuMat d_img1, d_resulte, d_resultd, d_resulto, d_resultc; cv:: Mat element = cv:: getStructuringElement ( cv:: MORPH_RECT, cv:: Size ( 5 , 5 ) ) ; d_img1. upload ( h_img1) ; cv:: Ptr< cv:: cuda:: Filter> filtere, filterd, filtero, filterc; filtere = cv:: cuda:: createMorphologyFilter ( cv:: MORPH_ERODE, CV_8UC1, element) ; filtere-> apply ( d_img1, d_resulte) ; filterd = cv:: cuda:: createMorphologyFilter ( cv:: MORPH_DILATE, CV_8UC1, element) ; filterd-> apply ( d_img1, d_resultd) ; filtero = cv:: cuda:: createMorphologyFilter ( cv:: MORPH_OPEN, CV_8UC1, element) ; filtero-> apply ( d_img1, d_resulto) ; filterc = cv:: cuda:: createMorphologyFilter ( cv:: MORPH_CLOSE, CV_8UC1, element) ; filterc-> apply ( d_img1, d_resultc) ; cv:: Mat h_resulte, h_resultd, h_resulto, h_resultc; d_resulte. download ( h_resulte) ; d_resultd. download ( h_resultd) ; d_resulto. download ( h_resulto) ; d_resultc. download ( h_resultc) ; cv:: imshow ( "Original Image " , h_img1) ; cv:: imshow ( "Erosion" , h_resulte) ; cv:: imshow ( "Dilation" , h_resultd) ; cv:: imshow ( "Opening" , h_resulto) ; cv:: imshow ( "closing" , h_resultc) ; cv:: imwrite ( "erosion7.png" , h_resulte) ; cv:: imwrite ( "dilation7.png" , h_resultd) ; cv:: imwrite ( "opening7.png" , h_resulto) ; cv:: imwrite ( "closing7.png" , h_resultc) ; cv:: waitKey ( ) ; return 0 ;
}