Python实现投影法分割图像示例(二)

作者:TIME_LEAF 时间:2021-04-19 01:53:18 

在上篇博客中,我们已经实现了水平投影和垂直投影图的绘制。接下来,我们可以根据获得的投影数据进行图像的分割,该法用于文本分割较多,所以此处依然以上次的图为例。

先把上次的两幅图搬过来,方便讲解。

Python实现投影法分割图像示例(二)

上面两图分别从垂直和水平方向描述了图像中文本的分布。我们想象一下,将两幅图重叠起来(当然这里比例要调整下),那么我们就能得到四个重叠的白块,而这些白块所处的位置正是原图中文本的位置。所以接下来的任务就是,找出这些白块的坐标,此处白块近似矩形,所以我们要求矩形的四个坐标。

下面看代码。


#根据水平投影值选定行分割点
inline = 1
start = 0
j = 0
for i in range(0,height):
 if inline == 1 and z[i] >= 150 : #从空白区进入文字区
   start = i #记录起始行分割点
   print i
   inline = 0
 elif (i - start > 3) and z[i] < 150 and inline == 0 : #从文字区进入空白区
   inline = 1
   hfg[j][0] = start - 2 #保存行分割位置
   hfg[j][1] = i + 2
   j = j + 1

确定行分割点的原理就是判断每一行的像素点数是否足够。我们可以从水平投影图中看出,白块是有文字的地方(原图是黑字白底,只是画投影图时选用白块黑底),即前面几行,灰度值为0的点的个数N很少,所以当遇到文字区时,N会很大,根据这一点,我们确定进入文字区的坐标(A1,B1)。然后,当从文字区出来时,N又变的很小,我们再记下它的坐标(A1,B2)。同理,我们可以确定列分割点。


 incol = 1
 start1 = 0
 j1 = 0
 z1 = hfg[p][0]
 z2 = hfg[p][1]
 for i1 in range(0,width):
   if incol == 1 and v[i1] >= 20 : #从空白区进入文字区
     start1 = i1 #记录起始列分割点
     incol = 0
   elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 : #从文字区进入空白区
     incol = 1
     lfg[j1][0] = start1 - 2  #保存列分割位置
     lfg[j1][1] = i1 + 2
     l1 = start1 - 2
     l2 = i1 + 2
     j1 = j1 + 1

最后根据矩形的坐标将文本在图中框出来。附上完整代码。


import cv2
import numpy
img = cv2.imread('D:/0.jpg',cv2.COLOR_BGR2GRAY)
height, width = img.shape[:2]
#print height, width
#resized = cv2.resize(img, (2*width,2*height), interpolation=cv2.INTER_CUBIC)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(_, thresh) = cv2.threshold(gray, 140, 255, cv2.THRESH_BINARY)
#使文字增长成块
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))#形态学处理,定义矩形结构
closed = cv2.erode(thresh, None, iterations = 7)
#cv2.imshow('erode',closed)
height, width = closed.shape[:2]
#print height, width
z = [0]*height
v = [0]*width
hfg = [[0 for col in range(2)] for row in range(height)]
lfg = [[0 for col in range(2)] for row in range(width)]
box = [0,0,0,0]
#水平投影
a = 0
emptyImage1 = numpy.zeros((height, width, 3), numpy.uint8)
for y in range(0, height):
 for x in range(0, width):
   cp = closed[y,x]
   #if np.any(closed[y,x]):
   if cp == 0:
     a = a + 1
   else :
     continue
 z[y] = a
 #print z[y]
 a = 0
#根据水平投影值选定行分割点
inline = 1
start = 0
j = 0
for i in range(0,height):
 if inline == 1 and z[i] >= 150 : #从空白区进入文字区
   start = i #记录起始行分割点
   #print i
   inline = 0
 elif (i - start > 3) and z[i] < 150 and inline == 0 : #从文字区进入空白区
   inline = 1
   hfg[j][0] = start - 2 #保存行分割位置
   hfg[j][1] = i + 2
   j = j + 1

#对每一行垂直投影、分割
a = 0
for p in range(0, j):
 for x in range(0, width):
   for y in range(hfg[p][0], hfg[p][1]):
     cp1 = closed[y,x]
     if cp1 == 0:
       a = a + 1
     else :
       continue
   v[x] = a #保存每一列像素值
   a = 0
 #print width
 #垂直分割点
 incol = 1
 start1 = 0
 j1 = 0
 z1 = hfg[p][0]
 z2 = hfg[p][1]
 for i1 in range(0,width):
   if incol == 1 and v[i1] >= 20 : #从空白区进入文字区
     start1 = i1 #记录起始列分割点
     incol = 0
   elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 : #从文字区进入空白区
     incol = 1
     lfg[j1][0] = start1 - 2  #保存列分割位置
     lfg[j1][1] = i1 + 2
     l1 = start1 - 2
     l2 = i1 + 2
     j1 = j1 + 1
     cv2.rectangle(img, (l1, z1), (l2, z2), (255,0,0), 2)      
cv2.imshow('result', img)
cv2.waitKey(0)

代码中注释掉的一些代码,有的是我做的一些小变动,有的是观察中间值。大家可自行查看。

最后放上结果图。

Python实现投影法分割图像示例(二)

由于文本的坐标已经有了,还可以把这些文本块截取下来,用一下PIL或者OPENCV就好了,此处就不做了。

来源:https://blog.csdn.net/TIME_LEAF/article/details/79422860

标签:Python,投影法,分割,图像
0
投稿

猜你喜欢

  • python基础教程之元组操作使用详解

    2023-11-29 01:18:52
  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    2023-11-20 14:14:52
  • Pycharm学习教程(1) 定制外观

    2021-08-01 05:18:11
  • 浅谈python锁与死锁问题

    2022-06-02 16:38:37
  • Python网络爬虫之爬取微博热搜

    2021-08-31 02:53:50
  • python 函数、变量中单下划线和双下划线的区别详解

    2021-06-29 11:32:33
  • 利用Python实现命令行版的火车票查看器

    2021-10-24 13:59:21
  • python tkinter实现弹窗的输入输出

    2021-10-03 14:58:42
  • Python使用ctypes调用C/C++的方法

    2023-09-01 21:27:47
  • 在FLASH中调用ASP的方法

    2009-03-09 18:32:00
  • 实现MySQL远程访问办法

    2010-11-25 17:17:00
  • 首页访问感受提升三步曲

    2007-12-13 20:36:00
  • git使用.gitignore设置不生效或不起作用问题的解决方法

    2021-06-09 17:17:07
  • 解决python中使用PYQT时中文乱码问题

    2023-07-28 10:15:51
  • np.ones的使用小结

    2021-05-20 06:55:34
  • Python3 tkinter 实现文件读取及保存功能

    2023-10-24 19:45:46
  • 机器学习之KNN算法原理及Python实现方法详解

    2023-05-17 00:38:43
  • python控制windows剪贴板,向剪贴板中写入图片的实例

    2021-03-27 07:35:31
  • Python自动化操作实现图例绘制

    2021-03-07 11:24:40
  • JavaScript的兼容性与调试技巧

    2023-07-14 07:56:28
  • asp之家 网络编程 m.aspxhome.com