※ 引述《sariel0322 (sariel)》之铭言:
: 如图
: http://i.imgur.com/3BlTd3Q.jpg
: 我想针对左上、左下、右上右下的图块做图形辨识
: 每一个图块中的黑点面积大小做Normalize后
: 每一个图块各转成一个matrix
: 并且可以忽略中间的黑色大十字
: 我原本想要利用PIL搭配座标与像素来计算
: 但发现好像每一个座标为单位的话量会太多
: 因此想请问一下,要怎么做才能达到我的目的
作者: neil987 (R5大小姐-EX人品崩坏) 看板: Test
标题: [测试] 123
时间: Tue Jun 13 11:47:32 2017
其实我的步骤是反过来
先做找到要辨识的4块区域,就可以忽略掉中间的大十字
我这边用python2.7 + opencv3.2 作法给你参考一下
img_r = cv2.resize(img,(0,0),fx=0.3,fy=0.3)
gray = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 1)
ret, binary = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY)
c_image,contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
##findContours里参数的意义请自己找
##img1 = img_r.copy()
##cv2.drawContours(img1, contours, -1, (0,0,255), 2)
##cv2.imshow('contours0', img1)
##观察第一次找到的轮廓
## http://i.imgur.com/cLN30Ct.jpg
##这里找到的contours太复杂,需要做第二次处理
new = []
##轮廓简化,函数与参数自己找
for i in range(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)
if(area < 500):
continue
epsilon = 0.09 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
hull = cv2.convexHull(approx)
rect = cv2.minAreaRect(hull)
box = cv2.boxPoints(rect)
box = np.int0(box)
new.append(box)
cv2.drawContours(img_r, new, -1, (0,0,255), 2)
cv2.imshow('contours1', img_r)
##观察简化过的轮廓
##http://i.imgur.com/L0P8bgf.jpg
##print new
##new里面有四个框框各自对应到的四个座标点
##cv2.imwrite('contour1.jpg',img_r)
cv2.waitKey(0)
cv2.destroyAllWindows()
取得4个roi后,可以再把座标往内缩,减少边框的干扰
roi = img2[y1+b1:y2+b2, x1+a1:x2+a2]
##http://i.imgur.com/L1Ppbhd.jpg
剩下的找面积就很简单了
正规化就把所有圆面积除以最大的圆面积
让所有面积介于0~1之间
自行发挥