OpenCv造轮子(三) 滑窗法实现数码管图像数字分割
2017-10-15 16:48
459 查看
因为做项目要用到这个方法,就用opencv+py实现了一下,很简单,先灰度二值化图像,统计Y轴像素点个数,滑窗检测间断点就可以:
这里谈一下为什么选择众数而不是平均数来当作误差项:因为如果otsu的效果很好的话,数码管显示的数字会被完美阈值化,但是还有可能出现边缘的亮带,假设亮带在图像中普遍存在,那么亮带的统计值一定是众数。经过很多张图片的实验的结果,证明了假设成立,当然为了不误判使用了众数自己当作阈值,这个即使在亮带明显断开的情况下效果也很好。
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的效果很好的话,数码管显示的数字会被完美阈值化,但是还有可能出现边缘的亮带,假设亮带在图像中普遍存在,那么亮带的统计值一定是众数。经过很多张图片的实验的结果,证明了假设成立,当然为了不误判使用了众数自己当作阈值,这个即使在亮带明显断开的情况下效果也很好。
相关文章推荐
- opencv3实现简单的数字图像识别(KNN)
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
- Opencv3实现图像分割之最大连通域算法
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
- opencv之分水岭实现图像分割
- 利用均值漂移实现图像分割的原理和OpenCV代码
- opencv用金字塔cvPyrSegmentation实现图像分割
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
- 利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
- 利用SVM支持向量机对彩色图像进行分割并使用OpenCV进行实现
- opencv实现图像分割,分离前景和背景(2)
- OpenCV学习 kmeans实现图像分割
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
- 分水岭算法分割图像的原理概述及OpenCV代码实现
- 数字图像的缩放及opencv中的实现
- Opencv实现用于图像分割分水岭算法
- opencv3实现一幅图像分割成多幅图像