如何从多个图像中提取单个 RGB 通道 Python
How to Extract Single RGB Channel from Multiple Images Python
我是 Python 的新手。
我想从多个图像中提取 RGB 值。我想使用每个图像的 RGB 值作为 K 折交叉验证的输入。
我只能获取一张图片的RGB值。所以我尝试使用以下代码从多个图像中获取:
from __future__ import with_statement
from PIL import Image
import glob
#Path to file
for img in glob.glob({Path}+"*.jpg"):
im = Image.open(img)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
#Open a file to write the pixel data
with open('output_file.csv', 'w+') as f:
f.write('R,G,B\n')
#Read the details of each pixel and write them to the file
for x in range(width):
for y in range(height):
r = pix[x,y][0]
g = pix[x,x][1]
b = pix[x,x][2]
f.write('{0},{1},{2}\n'.format(r,g,b))
我希望在 CSV 文件中得到这样的输入:
img_name,R,G,B
1.jpg,50,50,50
2.jpg,60,60,70
但实际输出的是包含 40000 多行的 CSV 文件。
是否可以从多个图像中自动生成 RGB 值?
您的代码当前将每个像素的值作为单独的行写入 CSV 文件中,因此您可能有大量的行。
要处理多个文件,您需要稍微重新安排代码并缩进循环内写入的文件。使用 Python 的 CSV 库来编写 CSV 文件也是一个好主意,以防万一您的任何文件名包含逗号。如果发生这种情况,它会正确地将字段括在引号中。
from PIL import Image
import glob
import os
import csv
#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(["img_name", "R", "G", "B"])
#Path to file
for filename in glob.glob("*.jpg"):
im = Image.open(filename)
img_name = os.path.basename(filename)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
print(f'{filename}, Width {width}, Height {height}') # show progress
#Read the details of each pixel and write them to the file
for x in range(width):
for y in range(height):
r = pix[x,y][0]
g = pix[x,y][1]
b = pix[x,y][2]
csv_output.writerow([img_name, r, g, b])
注意:获取 r
g
b
值时也存在问题,在两种情况下 [x,x]
。
如@GiacomoCatenazzi 所述,您的循环也可以删除:
from itertools import product
from PIL import Image
import glob
import os
import csv
#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(["img_name", "R", "G", "B"])
#Path to file
for filename in glob.glob("*.jpg"):
im = Image.open(filename)
img_name = os.path.basename(filename)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
print(f'{filename}, Width {width}, Height {height}') # show
#Read the details of each pixel and write them to the file
csv_output.writerows([img_name, *pix[x,y]] for x, y in product(range(width), range(height)))
我是 Python 的新手。 我想从多个图像中提取 RGB 值。我想使用每个图像的 RGB 值作为 K 折交叉验证的输入。
我只能获取一张图片的RGB值。所以我尝试使用以下代码从多个图像中获取:
from __future__ import with_statement
from PIL import Image
import glob
#Path to file
for img in glob.glob({Path}+"*.jpg"):
im = Image.open(img)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
#Open a file to write the pixel data
with open('output_file.csv', 'w+') as f:
f.write('R,G,B\n')
#Read the details of each pixel and write them to the file
for x in range(width):
for y in range(height):
r = pix[x,y][0]
g = pix[x,x][1]
b = pix[x,x][2]
f.write('{0},{1},{2}\n'.format(r,g,b))
我希望在 CSV 文件中得到这样的输入:
img_name,R,G,B
1.jpg,50,50,50
2.jpg,60,60,70
但实际输出的是包含 40000 多行的 CSV 文件。
是否可以从多个图像中自动生成 RGB 值?
您的代码当前将每个像素的值作为单独的行写入 CSV 文件中,因此您可能有大量的行。
要处理多个文件,您需要稍微重新安排代码并缩进循环内写入的文件。使用 Python 的 CSV 库来编写 CSV 文件也是一个好主意,以防万一您的任何文件名包含逗号。如果发生这种情况,它会正确地将字段括在引号中。
from PIL import Image
import glob
import os
import csv
#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(["img_name", "R", "G", "B"])
#Path to file
for filename in glob.glob("*.jpg"):
im = Image.open(filename)
img_name = os.path.basename(filename)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
print(f'{filename}, Width {width}, Height {height}') # show progress
#Read the details of each pixel and write them to the file
for x in range(width):
for y in range(height):
r = pix[x,y][0]
g = pix[x,y][1]
b = pix[x,y][2]
csv_output.writerow([img_name, r, g, b])
注意:获取 r
g
b
值时也存在问题,在两种情况下 [x,x]
。
如@GiacomoCatenazzi 所述,您的循环也可以删除:
from itertools import product
from PIL import Image
import glob
import os
import csv
#Open a file to write the pixel data
with open('output_file.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(["img_name", "R", "G", "B"])
#Path to file
for filename in glob.glob("*.jpg"):
im = Image.open(filename)
img_name = os.path.basename(filename)
#Load the pixel info
pix = im.load()
#Get a tuple of the x and y dimensions of the image
width, height = im.size
print(f'{filename}, Width {width}, Height {height}') # show
#Read the details of each pixel and write them to the file
csv_output.writerows([img_name, *pix[x,y]] for x, y in product(range(width), range(height)))