我用Python编写了一个脚本,在这个脚本中,我想找到一些相同维度的图像的中值。也就是说,我不想在位置[x,y]上取所有(红、绿、蓝)像素,并用它们的中值构造一个新的图像。在
我当前的方法使用Python-PIL(图像库),但是它非常慢!我非常喜欢使用OpenCV(cv2)接口,因为它将每个图像直接作为numpy数组加载。然而,当我堆叠维度为(25601920,3)的x图像时,索引总是出错。有什么帮助吗?在
我目前使用PIL的低效代码如下:
from PIL import Image, ImageChops,ImageDraw,ImageFilter,cv
import sys,glob,sys,math,shutil,time,os, errno,numpy,string
from os import *
inputs = ()
path = str(os.getcwd())
BGdummyy=0
os.chdir(path)
for files in glob.glob("*.png"):
inputs = inputs + (str(str(files)),)
BGdummy=0
for file in inputs:
BGdummy=BGdummy+1
im = cv.LoadImage(file)
cv.CvtColor( im, im, cv.CV_BGR2RGB )
img = Image.fromstring("RGB", cv.GetSize(im), im.tostring())
vars()["file"+str(BGdummy)] = img.load()
imgnew = Image.new("RGB", (2560,1920))
pixnew = imgnew.load()
for x in range(2560):
for y in range(1920):
R=[];G=[];B=[];
for z in range(len(inputs)):
R.append(vars()["file"+str(z+1)][x,y][0])
G.append(vars()["file"+str(z+1)][x,y][1])
B.append(vars()["file"+str(z+1)][x,y][2])
R = sorted(R)
G = sorted(G)
B = sorted(B)
mid = int(len(inputs)/2.)
Rnew = R[mid]
Gnew = G[mid]
Bnew = B[mid]
pixnew[x,y] = (Rnew,Gnew,Bnew)
BGdummyy = BGdummyy+1
imgnew.save("NewBG.png")
我将演示如何用5个大小为(3,3,3)的小数组来实现它。在
首先,我将创建5个数组,然后将它们保存在一个列表X中。(我在一行里做)
接下来,将每个图像展平成一行。所以早些时候你的形象会是
^{pr2}$这将变为
[R1 G1 B1 R2 G2 B2 R3 G3 B3......... R9 G9 B9]
。然后将所有这些平展的图像堆叠起来形成一个大的二维数组。在这个数组中,您可以看到,所有第一个红色像素都出现在第一列中,依此类推。然后你可以简单地申请np.中值为了这个。在我把每一张图片都涂上肥皂,然后叠起来。在我的例子中,Y是一个大小为5x27的数组(一个图像的行数、列数和像素数)
现在我找到这个Y的中间值,并将其重塑为原始图像形状:
完成了。在
为了确保它能正常工作,让我们检查任意像素的值,比如
Z[0,1,2]
:是的,数据是正确的。在
相关问题 更多 >
编程相关推荐