之前那个去除图片四周空白区域,针对的图片是背景前景只有两个值的,这种一般是自己生成的图片或者文档图片扫描图片能这么规则,但对于实际手写图片,就无能为力了,当初处理自己生成的训练集图片,前景背景值已知用这个方法,现在测试真实图片稍微复杂些,不过原理差不多。
先找出阈值ret
ret, otsu = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
再从图片四周往里检查,比如从行来看,从0行到rol-1行如果一行有k个像素点的的值大于阈值那,认为这是实际汉字的上边界,从rol-1行到第0行,如果一行有k个像素点的的值大于阈值那,认为这是实际汉字的下边界,同理找出左右边界,边界有了,抠图很容易。
def trim(img, thresh):
k=1#当大于阈值的像素点超过k个就认为是边界,这个也可以调,噪点多的话,要先去噪,k适当增大
thresh=thresh-20#调节作用,避免截的太狠
(row, col) = img.shape
tempr0 = 0
tempr1 = row-1
tempc0 = 0
tempc1 = col-1
for c in range(0, col):
if sum(map(lambda x:x<thresh,img[:,c]))>k:
tempc0 = c
break
for c in range(col - 1, 0, -1):
if sum(map(lambda x: x < thresh, img[:, c])) > k:
tempc1 = c
break
for r in range(0, row):
if sum(map(lambda x: x < thresh, img[r, :])) > k:
tempr0 = r
break
for r in range(row - 1, 0, -1):
if sum(map(lambda x: x < thresh, img[r, :])) > k:
tempr1 = r
break
new_img = img[tempr0:tempr1 + 1, tempc0:tempc1 + 1]
return new_img
img=cv2.imread('../../chc/data/small_roi/'+lists[i],0)
ret, otsu = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
img2=trim(img,ret)