python图像去黑边,极速版

python图像去黑边,极速版

前言

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

原理及代码

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

#遍历全部像素的去黑边代码
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

结果

如图
python图像去黑边,极速版_第2张图片

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

你可能感兴趣的:(python,去黑边,极速)