对不起,英语不好。我想做一个条件,左角有12的图像=右角有12的图像和!= 21的图像。
我需要一种快速的方法来确定这一点,因为有很多照片并且它们会刷新。
我尝试使用计数特定图像的像素:
result = np.count_nonzero(np.all(original > (0,0,0), axis=2))
(为什么我使用>(0,0,0)而不是==(255,255,255)?白色符号附近有灰色阴影,眼睛看不到)
这种方式看不到12和21之间的区别。
我尝试了第二种方法,将新图像与模板进行比较,但是发现在左上角和右上角之间有12到12个巨大的差异!
original = ('auto/5or.png' )
template= cv2.imread( 'auto/5t.png' )
res = cv2.matchTemplate( original, template, cv2.TM_CCOEFF_NORMED )
我还没有尝试确定数字的一些困难方法,因为我认为-即使在我的小照片上,这也太慢了。 (我可能会误会)。
我的数字只有0到30,我有所有的模板,示例,它们仅在黑色正方形内的位置有所不同。
有什么想法吗?预先感谢。
答案 0 :(得分:0)
如果您不希望图像中数字的位置有所不同,则可以将图像阈值设置为黑白,然后找到边界框并对其进行裁剪,以便数字始终位于同一位置-然后只需改变图像或使用您之前使用过的内容即可:
#!/usr/local/bin/python3
import numpy as np
from PIL import Image
# Open image, greyscale and threshold
im=np.array(Image.open('21.png').convert('L'))
# Mask of white pixels
mask = im.copy()
mask[mask<128] = 0 # Threshold pixels < 128 down to black
# Coordinates of white pixels
coords = np.argwhere(mask)
# Bounding box of white pixels
x0, y0 = coords.min(axis=0)
x1, y1 = coords.max(axis=0) + 1
# Crop to bbox
cropped = im[x0:x1, y0:y1]
# Save
Image.fromarray(cropped).save('result.png')
这给你这个:
显然也可以裁剪模板图像。
我对Python中的 OpenCV 不太熟悉,但是看起来像这样:
import cv2
# Load image
img = cv2.imread('21.png',0)
# Threshold at 127
ret,thresh = cv2.threshold(img,127,255,0)
# Get contours
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Get bounding box
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)