模板匹配(均值)+20201023

# 导入相应的库
from PIL import Image,ImageDraw
import numpy as np
import cv2



# 读取图像
big_image = Image.open("capture1-0.jpg")
small_image = Image.open("target_rectangle.png")
print("成功读取图像")
# 将图片转换为灰度图
big_image_rgb = big_image
big_image = big_image.convert('L')                   
small_image = small_image.convert('L')

将图像转换成灰度图像,像素值在0~255之间

# 转换为矩阵格式
big = np.array(big_image)
small = np.array(small_image)

print("打印图像尺寸:")
print("big:",big.shape)
print("small:",small.shape)
#从small中随机取50个点,可能用不完,多了备用
rand_point = []
for i in range(50):
    rand_point.append((np.random.randint(0,small.shape[0]-1) ,np.random.randint(0,small.shape[1]-1)))

从[0-模板图片的长]随机取50个数->x
从[0-模板图片的宽]随机取50个数->y

# 矩阵R 用来保存误差次数
R = np.zeros([big.shape[0]-small.shape[0],big.shape[1]-small.shape[1]])

sMean = np.mean(small) # 计算small的均值
print("正在进行计算,请稍后……")
for i in range(R.shape[0]):
    for j in range(R.shape[1]):
        loss = 0 #误差
        mean = np.mean(big[i:i+small.shape[0],j:j+small.shape[1]]) # s[i,j]的均值
        for n in range(len(rand_point)):
            point = rand_point[n] #从备选的随机点中取出一个随机点
            # 计算并叠加误差
            # 误差 = |备选区域中随机点的灰度值-备选区域均值 - small中随机点的灰度值 + small均值 |2
            loss += np.abs( big[i+point[0],j+point[1]] - mean - small[point[0],point[1]] + sMean)
            # 当误差超过一定的限度,记录下使用的随机点个数
            if loss >= 150 or n==len(rand_point)-1: 
                R[i,j] = n
                break # 跳出n循环
# 找到迭代次数最多的点,对应的索引即为小图对应左上角位置坐标
index = np.unravel_index(R.argmax(), R.shape)
 
print("左上角左边:",index)
xy = [(index[1],index[0]),(index[1]+small.shape[1],index[0]+small.shape[0])]

# 在big图中画出对应的位置
big_image = big_image_rgb #将big还原为RGB图像

x = index[0]
y = index[1]
print("x,y =",x,y)
x0 = xy[0][0]
y0 = xy[0][1]
x1 = xy[1][0]
y1 = xy[1][1]
xm = int((x0 + x1)/2)
ym = int((y0 + y1)/2)
print("xy",xy)

draw = ImageDraw.Draw(big_image)
draw.rectangle(xy,outline='red',width=3)

big_image = cv2.cvtColor(np.asarray(big_image),cv2.COLOR_RGB2BGR)
print("big_image",big_image.shape)
cv2.circle(big_image,(xm,ym),10,(255,0,0),3)
cv2.circle(big_image,(x0,y0),10,(0,0,225),3)
cv2.circle(big_image,(x1,y1),10,(0,0,225),3)

cv2.namedWindow("big",1)
cv2.imshow("big",big_image)
cv2.waitKey(80000)

#big_image.show()
#print("已保存图像结果")
#big_image.save("output.jpg")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PMAlign(Pattern Matching)模板匹配是一种计算机视觉技术,主要用于在图像中寻找与预定义模板相似的部分。它在许多应用场景中都很常见,比如人脸识别、物体检测和图像分析等。PMAlign通常涉及到以下几个关键步骤: 1. **模板选择或创建**:首先,你需要选择一个模板图像,这是你要在目标图像中查找的模式。这个模板通常代表你感兴趣的一部分特征。 2. **模板归一化**:为了确保匹配的准确性,模板可能需要进行归一化处理,如大小调整、旋转校正、灰度处理等,以便与目标图像中的特征对齐。 3. **搜索区域确定**:确定要在目标图像中进行搜索的区域,这可能是整个图像,也可能是一部分感兴趣区域。 4. **模板匹配算法**:常见的模板匹配方法有均值漂移法(MeanShift)、模板像素逐点比较(如SIFT或SURF)、相关匹配(Correlation)、局部二值模式(LBP)或级联分类器(如Haar或HOG+机器学习)等。 5. **计算相似度**:将模板与目标图像的每个子区域进行比较,计算匹配程度,例如计算像素间的欧几里得距离或相关系数。 6. **匹配位置确定**:找到最佳匹配的位置,通常是相似度最高的区域。 7. **后处理和结果评估**:可能需要进行一些后处理(如非极大值抑制)来优化结果,并根据实际需求评估匹配的准确性。 如果你想要在代码中实现PMAlign,你可能会使用像OpenCV这样的库,它提供了现成的模板匹配函数,如`cv2.matchTemplate()`或`cv2.matchFeaturesToTrack()`。复现的过程通常包括导入库、读取图像、定义模板、进行匹配操作以及解读返回的结果。 相关问题: 1. OpenCV中如何使用matchTemplate函数? 2. 除了OpenCV,还有哪些Python库可以用于模板匹配? 3. 如何处理模板匹配时可能出现的误报和漏报问题?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值