Python trim图片

之前那个去除图片四周空白区域,针对的图片是背景前景只有两个值的,这种一般是自己生成的图片或者文档图片扫描图片能这么规则,但对于实际手写图片,就无能为力了,当初处理自己生成的训练集图片,前景背景值已知用这个方法,现在测试真实图片稍微复杂些,不过原理差不多。

先找出阈值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)

猜你喜欢

转载自blog.csdn.net/XLM11/article/details/81667393