转载自:https://blog.csdn.net/xue_csdn/article/details/99077718
参考:https://www.cnblogs.com/zongfa/p/9130167.html
卷积核就是一个二维mxm矩阵。二维图像与二维矩阵卷积之后的结果,就实现了对图像的滤波。
卷积核一般有以下一些规则:
- m的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
- 矩阵所有元素之和一般等于1。如果和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
- 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。这与代码中参数设置有关。
上面说到,对图像的滤波处理就是对图像应用一个小小的卷积核。卷积核的内部结构不同,图像的处理效果也就完全不同。
1. 与原图一样的效果
卷积核:
得到的图像和原图是一样的。因为只有中心点的值是1。邻域点的权值都是0,对滤波后的取值没有任何影响。
2. 图像锐化
图像的锐化和边缘检测很像,首先找到边缘,然后把边缘加到原来的图像上面,这样就强化了图像的边缘。也就是在边缘检测滤波器的基础上,再在中心的位置加1,这样滤波后的图像就会和原始的图像具有同样的亮度了,但是会更加锐利。锐化滤波器实际上就是计算当前点和周围点的差别,然后将这个差别加到原来的位置上。
下边的滤波器更加强调边缘:
3. 边缘检测
找水平边缘(0度):
找垂直边缘(90度):
找45度边缘:
找135度边缘:
4. 浮雕效果
浮雕滤波器可以给图像一种3D阴影的效果。只要将中心一边的像素减去另一边的像素就可以了。这时候,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时候,图像大部分就变成灰色了。
45度浮雕效果:
增大滤波器,得到更夸张的效果:
5. 运动模糊
135度角的模糊,
均值模糊:
自定义内核对图像做卷积:
C++:
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main()
{
//system("color 02");
//读取原图
cv::Mat src = cv::imread("xxxxxxxxxx.jpg");//图像路径
//自定义内核
cv::Mat kernel = (cv::Mat_<float>(3, 3) << 1, 1, 1,
1, -7, 1,
1, 1, 1);
cv::Mat dst;
//卷积操作
cv::filter2D(src, dst, src.depth(), kernel);
cv::namedWindow("dst", CV_WINDOW_NORMAL);
cv::imshow("dst", dst);
cv::waitKey();
return 0;
}
Python:
import cv2
import numpy as np
img = cv2.imread('1-test.jpg',cv2.IMREAD_GRAYSCALE) #提取图像灰度值
kernel = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1])) #定义核
result = cv.filter2D(img,-1,kernel)
cv2.imshow('result.jpg', result)
cv2.waitKey()