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

因为做项目要用到这个方法,就用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的效果很好的话,数码管显示的数字会被完美阈值化,但是还有可能出现边缘的亮带,假设亮带在图像中普遍存在,那么亮带的统计值一定是众数。经过很多张图片的实验的结果,证明了假设成立,当然为了不误判使用了众数自己当作阈值,这个即使在亮带明显断开的情况下效果也很好。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值