1ピクセルよりも小さな値を表示させたいです。画像にあるいくつかの白い点が画像のどの位置にあるか出したいです。。
今すぐできる方法は以下の方法になります。
閾値 | 点数 | 座標 |
---|
180 | 1755 | [(110, 343), (110, 344), (111, 342),... |
170 | 2572 | [(110, 343), (110, 344), (111, 342),... |
160 | 4256 | [(110, 343), (110, 344), (110, 347),... |
上からthreshold=180,170,160
カメラに映る1ピクセルより細かい値は、画素の白さに反映されるはずですので、thresholdの値を調整することで取り漏らしは減らせます。
Python3
1import cv2
2import matplotlib.pyplot as plt
3import numpy as np
4
5# 画像を読み込んでリサイズ、グレースケール画像に
6img = cv2.imread("./20130707.png")
7img=img[100:785,80:765]
8gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
9
10
11# 180の場合
12#######################################
13threshold=180
14ret,img_thresh=cv2.threshold(gray,threshold,255,cv2.THRESH_BINARY)
15# cv2.imshow("img_thresh",img_thresh)
16ans = list(zip(*np.where(img_thresh==255)))
17print("Thresh=%s"%(threshold))
18print("LEN=%s"%(len(ans)))
19print(ans)
20# img_debug = img_thresh
21
22# 170の場合
23#######################################
24threshold=170
25ret,img_thresh=cv2.threshold(gray,threshold,255,cv2.THRESH_BINARY)
26# cv2.imshow("img_thresh",img_thresh)
27ans = list(zip(*np.where(img_thresh==255)))
28print("Thresh=%s"%(threshold))
29print("LEN=%s"%(len(ans)))
30print(ans)
31# img_debug = np.vstack((img_debug,img_thresh))
32
33# 160の場合
34#######################################
35threshold=160
36ret,img_thresh=cv2.threshold(gray,threshold,255,cv2.THRESH_BINARY)
37# cv2.imshow("img_thresh",img_thresh)
38ans = list(zip(*np.where(img_thresh==255)))
39print("Thresh=%s"%(threshold))
40print("LEN=%s"%(len(ans)))
41print(ans)
42# img_debug = np.vstack((img_debug,img_thresh))
43
44# cv2.imshow("img_debug",img_debug)
45# cv2.imwrite("./img_debug.png",img_debug)
46
47
48###白い点を検出
49### 輪郭を抽出
50##contours1, hierarchy = cv2.findContours(img_thresh, cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
51##
52###img=cv2.imread("./20130711.png",0)
53###img=img[100:785,80:765]
54###各輪郭に対する処理
55##detect_count=0
56##for i in range(0,len(contours1)):
57##
58## area=cv2.contourArea(contours1[i])
59## if area<50.0 or 2000.0<area:
60## continue
61## print('contour:{},area:{}'.format(detect_count,area))
62##
63## #矩形をつける
64## if len(contours1[i])>0:
65## rect=contours1[i]
66## x,y,w,h=cv2.boundingRect(rect)
67## cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
68## cv2.putText(img, "Num:"+str(detect_count),(x,y+h+15), cv2.FONT_HERSHEY_PLAIN, 0.8, (0,255,0),1)
69##
70## center_x=x+((w-x)/2)
71## center_y=y+((h-y)/2)
72## print('center of X:{},center of Y:{}'.format(center_x,center_y))
73##
74##
75## detect_count+=1
76##cv2.imshow("aa",img)
77cv2.waitKey(0)
78cv2.destroyAllWindows()
79
今は1ピクセルごとに座標を出せていますが、できたら1ピクセルよりも小さい値を出したいのです
OpenCVのresizeにcv2.INTER_LANCZOS4がありますので、これを使うといくらか滑らかに画像を拡大できます。(計算量を減らすために生画像をグレースケールにした後に)これで拡大して同じ処理をすれば、"サブピクセル"に相当する処理ができるはずです。
もっと滑らかに拡大したいのであれば、waifu2x(深層学習を使った滑らかな拡大)を使って拡大することが候補に挙がります。
※いずれにせよ、拡大方法を変えてサブピクセルに相当する処理をするだけで、実際にサブピクセルまで処理をする方法ではありません。
参考)
少なくとも私はOpenCVでのサブピクセルはコーナー検出では聞いたことがありますが、画素値の判定については聞いたことがありません。