您的位置:首页 > 运维架构

OpenCv造轮子(三) 滑窗法实现数码管图像数字分割

2017-10-15 16:48 459 查看
因为做项目要用到这个方法,就用opencv+py实现了一下,很简单,先灰度二值化图像,统计Y轴像素点个数,滑窗检测间断点就可以:

def split_by_pixel(img):
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#otsu大法好!
ret, img_thresh = cv2.threshold(img_gray, 130, 255, cv2.THRESH_OTSU)
#cv2.imshow("out", img_thresh)
h, w = np.shape(img_thresh)
#print(h, w)
#建立Y轴方向的直方图
y_hist = []
for i in range(w):
cnt = 0
for j in range(h):
if img_thresh[j][i] != 0:
cnt += 1
y_hist.append(cnt)
#print(y_hist)
#取众数减小误差
mean = np.argmax(np.bincount(y_hist))
#print(mean)
# sliding-window algorithm
st = []
en = []
flag = 0
for j in range(w):
if flag == 0 and y_hist[j] - mean > mean:
st.append(j)
flag = 1
if flag == 1 and y_hist[j] - mean <= mean:
en.append(j)
flag = 0
print(st, en)
size = len(st)
for i in range(size):
#减小误差,宽度过小的不要
if en[i] - st[i] < 10 :
continue
else:
tempfile = img[0:,st[i]:en[i]]
cv2.imwrite("s_"+str(i*i)+".jpg",tempfile)


这里谈一下为什么选择众数而不是平均数来当作误差项:因为如果otsu的效果很好的话,数码管显示的数字会被完美阈值化,但是还有可能出现边缘的亮带,假设亮带在图像中普遍存在,那么亮带的统计值一定是众数。经过很多张图片的实验的结果,证明了假设成立,当然为了不误判使用了众数自己当作阈值,这个即使在亮带明显断开的情况下效果也很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv