给定ground truth和实际拍摄图像,检测饮料瓶的数量,即给定模板图像与实际获取图像之间的相似度。
1. 图像hash值
2. 图像模板匹配
3. 图像ssim相似度比较
实际的图像如下所示:
均值哈希利用的是图片的低频信息对两张图片进行比较,低频信息如图像亮度变化较小的区域,高频信息如亮度变化剧烈的区域边缘等。
A: resize为(8, 8),灰度级的转化
B:mean和diff的计算, 去0和1的比较值
C: 组合hash值,即64位的整数
D:比较有多少不一样的,即汉明距离
#均值哈希算法
def aver_hash(img):
img = cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sum = 0
hash_str = ''
#遍历累加求像素和
for i in range(gray.shape[0]):
for j in range(gray.shape[1]):
sum = sum + gray[i,j]
avg = sum / 64
#灰度大于平均值为1相反为0生成图片的hash值
for i in range(gray.shape[0]):
for j in range(gray.shape[1]):
if gray[i,j] >avg:
hash_str = hash_str +'1'
else:
hash_str = hash_str +'0'
return hash_str
进行匹配窗口的滑动,寻找各个位置与模板的相似度。
匹配方法 | 方法 | 描述 |
平方差匹配法 | CV.TM_SQDIFF | 两图像像素差的平方 |
相关匹配法 | CV.TM_CCORR | 两图像的乘法操作 |
#模板匹配
def math_tmplate(gt_img, test_img):
gt_gray = cv2.cvtColor(gt_img, cv2.COLOR_BGR2GRAY)
test_gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)
res = cv2.matchTemplate(test_gray, gt_gray, cv2.TM_SQDIFF_NORMED) #TM_CCOEFF_NORMED
return res[0][0]
从亮度,对比度和结构三个方面进行度量,高斯加权的均值、方差、协方差,计算对应block快的结构相似度。
#ssim
def math_sssim(gt_img, test_img):
gt_gray = cv2.cvtColor(gt_img, cv2.COLOR_BGR2GRAY)
test_gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)
(score, diff) = compare_ssim(test_gray, gt_gray, full=True)
return score
计算数量, 无论选择hsv 或者rgb的色域处理, 总会找到与底部导轨类似的饮料。
不同的相似度计算如下, 最终选择模板匹配的方法进行相似度的计算, 检测饮料的瓶盖数量。
the diff is: [0.53125, 0.234375, 0.90625, 1.0 ]
the aver is: [0.59375, 0.1875, 0.92187, 0.828125 ]
the tmp is: [0.70079243, 1.0, 0.30529, 0.07561831 ]
the ssim is: [0.1359543696, -0.18731236, 0.75678, 0.91473222 ]