模板匹配
模板匹配就是整个图像区域发现与给定子图像匹配的小块区域;所以模板匹配首先需要一个模板图像T(给定的子图像),另外需要一个待检测的图像--原图像S
工作方法:在待检测图像上,从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者之间的可能性越大
当然这需要特定的工作场景,因为随机一张图像的话会受到一些噪声的影响,做模板匹配的精度也许不会那么高;工业上用的比较少
这里就不介绍代码了,需要的时候再行百度吧
图像二值化
二值图像:像素值只有0或者255两种选择
opencv中图像二值化的方法:
- otsu
- Triangle
- 自动和手动
- 自定义阈值
def threshold_demo(image):
# 二值化要对灰度图进行操作
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 采用OTSU的方法进行二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
# 查看阈值
print(ret)
cv.imshow('bianry', binary)
cv.imwrite('D:/2019-02/image181.jpg', bianry)
image = cv.imread('D:/2019-02/image18.jpg')
threshold_demo(image)
cv.waitKey(0)
输出阈值是146
原图像:
二值化图像:
下面试一下Triangle
def threshold_demo(image):
# 二值化要对灰度图进行操作
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 采用OTSU的方法进行二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
# 查看阈值
print(ret)
cv.imshow('bianry', binary)
# cv.imwrite('D:/2019-02/image181.jpg', binary)
image = cv.imread('D:/2019-02/image18.jpg')
threshold_demo(image)
cv.waitKey(0)
输出阈值是196
运行结果图像:
对于图像的直方图只有单一波峰的时候使用Triangle方法效果会非常好,如果图像颜色比较多样还是使用OTSU方法
自适应二值化:
def local_threshold_demo(image):
# 二值化要对灰度图进行操作
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# blockSize一定需要设定为奇数
# C的值表示如果像素值减去均值大于10那么就设定为白色,否则设定为黑色
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, blockSize=25, C=10)
cv.imshow('bianry', binary)
cv.imwrite('D:/2019-02/image181.jpg', binary)
image = cv.imread('D:/2019-02/image18.jpg')
local_threshold_demo(image)
cv.waitKey(0)
运行结果:
图像金字塔
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效的但是简单的结构。简单来说,图像金子塔就是用来进行图像缩放的,进行图像缩放可以用图像金字塔,也可以用resize函数,后者的效果更好
金字塔类型:高斯和拉普拉斯
高斯金字塔:首先将原图像作为最底层G0,(金字塔的第0层),利用高斯核5*5对其进行卷积,然后对卷积后的图像进行下采样,得到上一层的图像G1
上采样:就是图片放大,先将图像在每个位置放大为原来的两倍,新增的列和行用0填充,再使用先前同样的卷积核与放大后的图像进行卷积,获得新图像的近似值
拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度还原;用高斯金字塔的每一层图像减去上一层的图像上采样并高斯卷积后的预测图像,得到一系列的差值图像即为LP分解图像
下采样:就是图像缩小,先将图像与高斯内积核进行卷积,然后再将所有的偶数行和列去除