本文实例为大家分享了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