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)

 

Python提供了多种库来实现大像素图片的裁剪,如PIL(Pillow)和OpenCV等,还可运用高级技巧及多线程或分布式计算加速处理。 使用PIL(Pillow)库裁剪大像素图片的示例代码如下: ```python from PIL import Image # 打开大像素图片 img = Image.open('big_image.png') # 定义裁剪区域,(左上角x坐标, 左上角y坐标, 右下角x坐标, 右下角y坐标) region = img.crop((100, 100, 500, 500)) # 保存裁剪后的图片 region.save('cropped_image.png') ``` 上述代码通过PIL库打开大像素图片,指定裁剪区域的左上角和右下角坐标进行裁剪,并保存裁剪后的图片。 使用OpenCV库裁剪大像素图片的示例代码如下: ```python import cv2 # 读取大像素图片 img = cv2.imread('big_image.png') # 定义裁剪区域,(左上角y坐标:右下角y坐标, 左上角x坐标:右下角x坐标) cropped_img = img[100:500, 100:500] # 保存裁剪后的图片 cv2.imwrite('cropped_image_opencv.png', cropped_img) ``` 此代码使用OpenCV库读取大像素图片,指定裁剪区域的坐标范围进行裁剪,并保存裁剪后的图片。 还可根据特定条件进行自适应裁剪,例如通过分析图像的像素分布和特征,确定最有价值的裁剪区域。另外,使用多线程或分布式计算可加速大规模图像的裁剪处理,不过实现会更复杂,需要结合相应的多线程或分布式计算库来完成。对于大像素图片,使用PIL库的`getbbox`方法去除角元素后的边距信息并裁剪的示例如下: ```python from PIL import Image # 待裁剪图像 trimUrl = 'big_image.png' # 裁剪后图像 exportTrimUrl = 'big_image_trim-export.png' im = Image.open(trimUrl) # 去除角元素后的边距信息 print(im.getbbox()) # 剪裁 im2 = im.crop(im.getbbox()) im2.save(exportTrimUrl) ``` 此代码利用`getbbox`方法获取裁剪区域信息,然后进行裁剪并保存图片 [^1][^3][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值