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
结果
如图
注
觉得有用的话,麻烦点赞加关注哦,谢谢。有什么不懂的也可以留言提问。