python图像去黑边,极速版

10 篇文章 2 订阅

python图像去黑边,极速版

前言

自己要对扫描仪传来的图片进行识别工作,有的扫描仪的去黑边功能不完善,结果还需要我给它再加一个去黑边的步骤。但因为我的工作对图像处理的速度要求很高,一张图片的处理速度要压缩在0.3s以内。而网上的去黑边的方法速度太慢了,(处理示例图片大概0.8s到1s的样子)。自己看了下有改进的空间,试了下速度快了10倍吧,于是分享给大家。

原理及代码

图像去除黑边的原理比较简单。就是记录不是黑边的点的位置。如图(自己随便画的),也就那四个红点的位置。然后根据红点的位置把图片截出来。
示例图片
网上普遍的代码都是遍历这张图片的全部像素,代码如图。虽然能完成去黑边的功能但速度达不到我的要求。

#遍历全部像素的去黑边代码
def remove_black_edges(gray):
    x=gray.shape[1]
    y=gray.shape[0]
    edges_x=[]
    edges_y=[]
    #optimization...
    
    for i in range(x):
        for j in range(y):
            if int(gray[j][i])==255:
                edges_x.append(i)
                edges_y.append(j)
       
    #...optimization
    left=min(edges_x)               #左边界
    right=max(edges_x)              #右边界
    bottom=min(edges_y)             #底部
    top=max(edges_y)                #顶部
    gray2=gray[bottom:top,left:right]
    return gray2 

自己做了些改进,本身没必要遍历全部像素,只需要从上,下,左,右依次遍历到非黑色的点就好。改进的代码如下

#改进的去黑边代码
def remove_black_edges_optimization(image):
	gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    x=gray.shape[1]
    y=gray.shape[0]
    edges_x=[]
    edges_y=[]
    edges_x_up=[]
    edges_y_up=[]
    edges_x_down=[]
    edges_y_down=[]
    edges_x_left=[]
    edges_y_left=[]
    edges_x_right=[]
    edges_y_right=[]

    for i in range(x):
        for j in range(y):
            if int(gray[j][i])>10:
                edges_x_left.append(i)
                edges_y_left.append(j)
        if len(edges_x_left)!=0 or len(edges_y_left)!=0:
            break

    for i in range(x):
        for j in range(y):
            if int(gray[j][x-i-1])>10:
                edges_x_right.append(i)
                edges_y_right.append(j)
        if len(edges_x_right)!=0 or len(edges_y_right)!=0:
            break
        
    for j in range(y):
        for i in range(x):
            if int(gray[j][i])>10:
                edges_x_up.append(i)
                edges_y_up.append(j)
        if len(edges_x_up)!=0 or len(edges_y_up)!=0:
            break

    for j in range(y):
        for i in range(x):
            if int(gray[y-j-1][i])>10:
                edges_x_down.append(i)
                edges_y_down.append(j)
        if len(edges_x_down)!=0 or len(edges_y_down)!=0:
            break
        
    edges_x.extend(edges_x_left)
    edges_x.extend(edges_x_right)
    edges_x.extend(edges_x_up)
    edges_x.extend(edges_x_down)
    edges_y.extend(edges_y_left)
    edges_y.extend(edges_y_right)
    edges_y.extend(edges_y_up)
    edges_y.extend(edges_y_down)

    left=min(edges_x)               #左边界
    right=max(edges_x)              #右边界
    bottom=min(edges_y)             #底部
    top=max(edges_y)                #顶部

    image2=image[bottom:top,left:right]
    return image2

结果

如图
去黑边结果

觉得有用的话,麻烦点赞加关注哦,谢谢。有什么不懂的也可以留言提问。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西瓜6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值