大图找小图,模糊识别?python
大图找小图2.0之前写过截屏的大图找小图,但是,那个仅限于像素没有变化的情况下,如果说我用相机拍下我的桌面,想去寻找一个图标,上一个方法是行不通的。思路1.对两张图片进行图像金字塔的处理,当需要寻找的图标变成了一个像素点即可停止,而被寻找的图片也要进行金字塔处理,不够不必太多,大概2-3次即可。2.对处理过的大图,进行遍历,寻找出所有和图标像素点最接近的点(欧拉距离)3.对寻找出来的像素点坐标进行
·
大图找小图2.0
之前写过截屏的大图找小图,但是,那个仅限于像素没有变化的情况下,如果说我用相机拍下我的桌面,想去寻找一个图标,上一个方法是行不通的。
思路
1.对两张图片进行图像金字塔的处理,当需要寻找的图标变成了一个像素点即可停止,而被寻找的图片也要进行金字塔处理,不够不必太多,大概2-3次即可。
2.对处理过的大图,进行遍历,寻找出所有和图标像素点最接近的点(欧拉距离)
3.对寻找出来的像素点坐标进行聚类(KNN,DBSCAN),寻找出最大数量的那类,那就是我们要找的图标
4.在图中画出来
代码
图像金字塔进行处理
def image_pyramid():#预处理,图像金字塔
image_find =cv2.imread("1.png")
image_big = cv2.imread("3.jpg")
for i in range(6):
image_find = cv2.pyrDown(image_find)
#cv2.imshow('1',image_find)
#print(image_find.shape)
cv2.imwrite('1_temp.png', image_find)
for i in range(3):
image_big = cv2.pyrDown(image_big)
#cv2.imshow('1',image_big)
#print(image_find.shape)
cv2.imwrite('2_temp.png', image_big)
要寻找的图标:
原图:
图像金字塔处理以后:
遍历:
def image_contrast():#再次读取图片进行操作
image_find = Image.open("1_temp.png")
image_big = Image.open("2_temp.png")
data1 = image_find.load()
data2 = image_big.load()
x,y = image_big.size
a = list(data1[0,0])
temp_get=[]
for i in range(x):
for j in range(y):
b= data2[i,j]
temp = Euclidean_distance(a,b)#统计整张图片的的像素点与目标图像像素点的欧氏距离
if temp < 50:
temp_get.append([i,j])#保存符合要求的像素点的位置
temp_get = clustering(temp_get)#聚类,返回最大的那一类的坐标
data2 = Draw_square(temp_get,data2)
image_big.show()
进行遍历以后找到的点:
聚类以后画出:
完整代码:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
from PIL import Image
import numpy as np
import sklearn
from sklearn import cluster
import cv2
def Euclidean_distance(a, b):#欧氏距离
return sum((np.array(a)-np.array(b))**2)**(0.5)
def clustering(temp_get):#用DBSCAN聚类
mod = sklearn.cluster.DBSCAN(eps=5,min_samples=8,)
mod.fit(temp_get)
pro = mod.fit_predict(temp_get)
pro = np.array(pro)
index, num = np.unique(pro,return_counts=True)
max_num =index[np.where(np.array(num)==np.array(num).max())]
temp_get = [temp_get[i] for i in range(len(temp_get)) if pro[i] == max_num]
return temp_get
def image_pyramid():#预处理,图像金字塔
image_find =cv2.imread("1.png")
image_big = cv2.imread("3.jpg")
for i in range(6):
image_find = cv2.pyrDown(image_find)
#cv2.imshow('1',image_find)
#print(image_find.shape)
cv2.imwrite('1_temp.png', image_find)
for i in range(3):
image_big = cv2.pyrDown(image_big)
#cv2.imshow('1',image_big)
#print(image_find.shape)
cv2.imwrite('2_temp.png', image_big)
def image_contrast():#再次读取图片进行操作
image_find = Image.open("1_temp.png")
image_big = Image.open("2_temp.png")
data1 = image_find.load()
data2 = image_big.load()
x,y = image_big.size
a = list(data1[0,0])
temp_get=[]
for i in range(x):
for j in range(y):
b= data2[i,j]
temp = Euclidean_distance(a,b)#统计整张图片的的像素点与目标图像像素点的欧氏距离
if temp < 50:
temp_get.append([i,j])#保存符合要求的像素点的位置
temp_get = clustering(temp_get)#聚类,返回最大的那一类的坐标
data2 = Draw_square(temp_get,data2)
image_big.show()
def Draw_square(temp_get, data2):#画图,画出正方形框起来
temp_x = [temp_get[i][0] for i in range(len(temp_get))]
temp_y = [temp_get[i][1] for i in range(len(temp_get))]
temp_y = np.array(temp_y)
temp_x = np.array(temp_x)
max_x = int(temp_x.max())
max_y = int(temp_y.max())
min_x = int(temp_x.min())
min_y= int(temp_y.min())
for i in range(max_x-min_x):
data2[min_x+i, min_y] = (255, 0, 0)
data2[min_x+i, max_y] = (255, 0, 0)
for j in range(max_y-min_y):
data2[min_x, min_y+j] = (255, 0, 0)
data2[max_x, min_y+j] = (255, 0, 0)
return data2
if __name__ == "__main__":
image_pyramid()
image_contrast()
最后
其实本来是想做一个神经网络来判断图标的位置的,然后觉得,我没有数据啊,自己标注位置也太麻烦了,然后我就做了这样一个程序,可能适用性很低,相关参数还要具体的调整,但是至少,找出来了。
更多推荐
已为社区贡献2条内容
所有评论(0)