+-

在你开始阅读之前,我要向你道歉;我是Python新手,所以如果这个问题看起来很简单,我很抱歉。
我想把我有的一组图像,并对它们进行归一化处理,以便用于深度网络训练(用图像的每个像素除以标准差,然后减去像素的平均值),然后用Python分别保存所得到的图像。我已经能够用代码使图像归一化,但我的问题在于保存图像时,它们的像素值为负值。
我已经看到 这个问题 并看完了答案,但我的问题是用户 Swaroop 评论中提到的问题。所提供的答案对我使用的图像类型不适用(有三个通道的图像,或 "RGB")。
这是我的全部代码。
import matplotlib.pyplot as plt
import numpy as np
import copy
import math
from PIL import Image
# Setup Important Variables
basic_path = 'Censored_for_privacy_reasons'
mins = 0
# Setup Standard Deviation Function
def stDevImage(imageArray, plane):
stDevArray = []
stDevAdd = 0
for row in range(0,imageArray.shape[0]):
for column in range(0,imageArray.shape[1]):
stDevArray.append(copy.deepcopy(imageArray[row][column][plane]))
meanForArray = np.mean(stDevArray)
for pixelValue in range(0,len(stDevArray)):
stDevAdd += pow(stDevArray[pixelValue]-meanForArray,2)
stDev = math.sqrt(stDevAdd/len(stDevArray))
return [stDev, meanForArray]
img = plt.imread(basic_path+'25/NS0/NS0_1.png')
imgArray = np.asarray(img)
normImage = copy.deepcopy(imgArray)
rPlaneSt = stDevImage(imgArray, 0)
gPlaneSt = stDevImage(imgArray, 1)
bPlaneSt = stDevImage(imgArray, 2)
for row in range(0, imgArray.shape[0]):
for column in range(0,imgArray.shape[1]):
normImage[row][column][0] = copy.deepcopy(normImage[row][column][0]/rPlaneSt[0]-rPlaneSt[1])
normImage[row][column][1] = copy.deepcopy(normImage[row][column][1]/gPlaneSt[0]-gPlaneSt[1])
normImage[row][column][2] = copy.deepcopy(normImage[row][column][2]/bPlaneSt[0]-bPlaneSt[1])
if normImage[row][column][0] < mins:
mins = copy.deepcopy(normImage[row][column][0])
imgFinal = Image.fromarray(normImage, 'I')
imgFinal.save("/Users/Censored/Desktop/test.tif")
标注为 stDevImage 是提供它所摄取的图像中平面的标准差的函数。它既返回该平面的标准差,也返回平均值。
正如你在最后两行代码中所看到的,我正在尝试上面提到的问题的答案,但没有用。
下面是一张图片,它代表了我正在处理的图片类型(它也是代码中的一行所引用的图片,内容为 img = plt.imread(basic_path+'25/NS0/NS0_1.png')).
图片在这里
任何和所有的帮助都将非常感激!
1
投票
投票
我建议你尝试以下包,在Python中访问浮点TIFF文件。
tifffile 包,或 OpenCVcv2.imwrite()
cv2.imwrite()或 libvips或 魔杖.