用Java+OpenCV学习计算机视觉-空间滤波与边缘检测
空间滤波
空间滤波和后来的深度学习里面的卷积的概念是类似的,之前在实习面试字节跳动的时候,还没有学计算机视觉这门课程,但是有深度学习的一些基础,面试官问我知不知道空间滤波,我说不知道。。。现在才发现空间滤波和卷积的概念是类似的。。
关于空间滤波和卷积的概念这篇文章讲的挺不错的,可以去看看:https://www.cnblogs.com/xiaojianliu/p/9075872.html
其实就相当于一个小矩阵在一个大矩阵上进行从上到下,从左到右的滑动,然后运算是矩阵对应位置的点乘。
对应的代码实现如下:
/**
* 滤波,不会检测滤波器的有效性,忽略边缘。
*
* @param src 原图像
* @param kernel 滤波器
* @return 滤波之后的图像
*/
public static Mat filter(Mat src, Mat kernel) {
//忽略边缘
Mat dst = new Mat(src.rows() - kernel.rows() + 1, src.cols() - kernel.cols() + 1, CvType.CV_8SC1);
int rowBegin = kernel.rows() / 2;
int colBegin = kernel.cols() / 2;
//进行卷积操作
for (int i = 0; i < src.rows() - 2 * rowBegin; i++) {
for (int j = 0; j < src.cols() - 2 * colBegin; j++) {
double result = 0.0;
for (int ii = 0; ii < kernel.rows(); ii++) {
for (int jj = 0; jj < kernel.cols(); jj++) {