我有3个嵌套循环:一个遍历5个图像,一个遍历每个图像的3个RGB通道,最后一个创建每个图像的直方图。我想用下面的代码把每个图像的直方图写在CSV文件中。然而,它不是为每个通道重复256次,而是只打印前256次,然后停止工作。此方法适用于print()
函数。为什么它不通过每一个与我的CSV文件?
for image in images:
img = cv2.imread("%s%s" % (path, image)) # Load the image
channels = cv2.split(img) # Set the image channels
colors = ("b", "g", "r") # Initialize tuple
plt.figure()
plt.title("Color Histogram")
plt.xlabel("RGB Bins")
plt.ylabel("Number of Pixels")
for (i, col) in zip(channels, colors): # Loop over the image channels
hist = cv2.calcHist([i], [0], None, [256], [0, 256]) # Create a histogram for current channel
plt.plot(hist, color=col) # Plot the histogram
plt.xlim([0, 256])
hist = hist.astype(int)
print(hist)
with open('mycsv.csv', 'w', newline='') as f:
thewriter = csv.writer(f)
thewriter.writerows(hist)
打开带有"w";模式会擦除其内容。您应该使用";a";附加或";a+";如果您想同时追加和读取文件。在任何情况下,指针都会放在文件的末尾。
"每次以w模式打开mycsv.csv时,它都会删除以前的内容。您应该在所有循环之前打开文件一次,或者以要附加的模式打开它。–Barmar";
这很有效,非常感谢。我是SOF的新手,所以我不知道如何将其标记为有效答案。无论如何,固定的代码是:
open('mycsv.csv','a',newline=''(为f:…