使用opencv获取图像的较暗线条

使用opencv获取图像的较暗线条,opencv,adaptive-threshold,Opencv,Adaptive Threshold,我们如何去除图像中较亮的线条,而只得到较暗的线条 下图中有一个数独游戏(取自)。自适应高斯阈值提供了非常好的结果,但它也包括灰色(较轻)线 注意:我试过canny,但它也删除了数字 如果我先进行背景均衡,然后使用全局阈值,然后使用形态学操作(如扩张和侵蚀),我会得到最好的结果 以下示例在我的iPython笔记本中运行,使用的是python 3.4和Ubuntu 15.10上的opencv 3.1-dev: 导入cv2 将numpy作为np导入 将matplotlib.pyplot作为plt导入

我们如何去除图像中较亮的线条,而只得到较暗的线条

下图中有一个数独游戏(取自)。自适应高斯阈值提供了非常好的结果,但它也包括灰色(较轻)线

注意:我试过canny,但它也删除了数字


如果我先进行背景均衡,然后使用全局阈值,然后使用形态学操作(如扩张和侵蚀),我会得到最好的结果

以下示例在我的iPython笔记本中运行,使用的是python 3.4和Ubuntu 15.10上的opencv 3.1-dev:

导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
%matplotlib内联
image=cv2.imread('sudokubig.jpg',0)
如果图像为无:
raise VALUERROR('找不到映像!')
#背景均衡
最大值=np.max(图像)
backgroundRemoved=image.astype(float)
模糊=cv2.GaussianBlur(背景移除,(151151),50)
背景移除=背景移除/模糊
backgroundRemoved=(backgroundRemoved*最大值/np.max(backgroundRemoved)).astype(np.uint8)
图=plt.图(图尺寸=(20,20))
plt.subplot(311)、plt.imshow(图像“灰色”)、plt.title(“输入”)、plt.axis(“关闭”)
plt.子地块(312)、plt.imshow(背景删除,“灰色”)、plt.title(背景删除”)、plt.axis(关闭)
ret,thres=cv2.阈值(背景移除,130255,cv2.阈值)
#删除水平线
内核=np.ones((4,1),np.uint8)
扩张1=cv2.扩张(thres,内核,迭代次数=1)
#删除垂直线
内核=np.ones((1,4),np.uint8)
扩张(扩张1,内核,迭代次数=1)
内核=np.ones((3,3),np.uint8)
侵蚀=cv2。侵蚀(膨胀2,内核,迭代次数=1)
plt.子地块(313),plt.imshow(侵蚀,'灰色'),plt.title('最终'),plt.axis('关闭')
plt.show()
内核=np.ones((1,4),np.uint8)
扩张=cv2。扩张(扩张,内核,迭代次数=1)
内核=np.ones((3,3),np.uint8)
侵蚀=cv2。侵蚀(膨胀、内核、迭代次数=1)
图=plt.图()
plt.imshow(侵蚀,cmap='gray'),plt.title('missmatch'))
plt.show()


也许你会找到一个更聪明的方法或者更好的伴侣。我很想在这里看到您的改进,但我希望这个简短的片段能对您有所帮助。

如果我先进行背景均衡,这样我就可以使用全局阈值,然后使用形态学操作,如扩张和侵蚀,我会得到最好的结果

以下示例在我的iPython笔记本中运行,使用的是python 3.4和Ubuntu 15.10上的opencv 3.1-dev:

导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
%matplotlib内联
image=cv2.imread('sudokubig.jpg',0)
如果图像为无:
raise VALUERROR('找不到映像!')
#背景均衡
最大值=np.max(图像)
backgroundRemoved=image.astype(float)
模糊=cv2.GaussianBlur(背景移除,(151151),50)
背景移除=背景移除/模糊
backgroundRemoved=(backgroundRemoved*最大值/np.max(backgroundRemoved)).astype(np.uint8)
图=plt.图(图尺寸=(20,20))
plt.subplot(311)、plt.imshow(图像“灰色”)、plt.title(“输入”)、plt.axis(“关闭”)
plt.子地块(312)、plt.imshow(背景删除,“灰色”)、plt.title(背景删除”)、plt.axis(关闭)
ret,thres=cv2.阈值(背景移除,130255,cv2.阈值)
#删除水平线
内核=np.ones((4,1),np.uint8)
扩张1=cv2.扩张(thres,内核,迭代次数=1)
#删除垂直线
内核=np.ones((1,4),np.uint8)
扩张(扩张1,内核,迭代次数=1)
内核=np.ones((3,3),np.uint8)
侵蚀=cv2。侵蚀(膨胀2,内核,迭代次数=1)
plt.子地块(313),plt.imshow(侵蚀,'灰色'),plt.title('最终'),plt.axis('关闭')
plt.show()
内核=np.ones((1,4),np.uint8)
扩张=cv2。扩张(扩张,内核,迭代次数=1)
内核=np.ones((3,3),np.uint8)
侵蚀=cv2。侵蚀(膨胀、内核、迭代次数=1)
图=plt.图()
plt.imshow(侵蚀,cmap='gray'),plt.title('missmatch'))
plt.show()


也许你会找到一个更聪明的方法或者更好的伴侣。我很想在这里看到您的改进,但我希望这个简短的片段能对您有所帮助。

Wow perfect。谢谢,太好了。谢谢