本文实例为大家分享了python实现求纯色彩图像的边框,供大家参考,具体内容如下
先上效果图,这里显示有点色差, 实际数值是纯色的, 而不是混色的.
放大局部细节看是这样的
原图是下面这样的
这个算法最大的特点是保留原始像素的数值, 而不是把边框统一变成白色.
实现的算法也超级简单. 就是有点慢. 考虑到我这个应用场景对性能要求不高, 比人快就行. 人工是它的几百倍. 所以也就无所谓啦.
测试结果一张1080*1920的图用时3秒, 如果换成c语言估计0.5秒左右.
算法原理, 每次4个田子形像素逐行扫描. 发现4个像素不一致的就输出到结果图上. 否则就是输出0.
代码如下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# # demo.py # 识别单张图片 # import argparse import os import numpy as np import time from modeling.deeplab import * from dataloaders import custom_transforms as tr from pil import image from torchvision import transforms from dataloaders.utils import * from torchvision.utils import make_grid, save_image,to_image import matplotlib matplotlib.use( 'tkagg' ) import matplotlib.pyplot as plt def main(): im = image. open ( "test_border.png" ) npimg = np.array(im) # 这个图片是1维的索引图. # chwimg = npimg.transpose(2,0,1) # hwc 变成 chw 格式的矩阵 print (npimg.shape) h,w,c = npimg.shape src = np. sum (npimg,axis = 2 ) # 这里测试用, 先把3通道的合成了一个通道的, 实际使用的时候也是1通道的. print (src.shape) borderimg = np.zeros(src.shape) #默认都输出了0 后面就不用输出0了. # 修补bug, 解决边框线会丢失的问题. borderimg[ 0 ,:] = src[ 0 ,:] borderimg[:, 0 ] = src[:, 0 ] borderimg[ - 1 ,:] = src[ - 1 ,:] borderimg[:, - 1 ] = src[:, - 1 ] t1 = time.time() for x in range ( 0 ,h - 1 , 1 ): for y in range ( 0 ,w - 1 , 1 ): # point = src[x,y] # if(point>0): # print(point) if not (src[x,y] = = src[x + 1 ,y] = = src[x,y + 1 ] = = src[x + 1 ,y + 1 ]): # 发现4个像素不一致的就输出到结果图上. borderimg[x,y] = src[x,y] borderimg[x + 1 ,y] = src[x + 1 ,y] borderimg[x,y + 1 ] = src[x,y + 1 ] borderimg[x + 1 ,y + 1 ] = src[x + 1 ,y + 1 ] t2 = time.time() print ( "耗时" ,t2 - t1) plt.figure() plt.title( 'display' ) plt.imshow(src) plt.show( ) plt.imshow(borderimg) plt.show( ) print ( "start test get image border ..." ) if __name__ = = "__main__" : main() else : main() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/phker/article/details/115483369