我正在嘗試創建一個平均影像像素值的程式,但到目前為止它剛剛生成了垂直線。
到目前為止,這是我的代碼:
from typing import List
import cv2 as cv
import numpy as np
def main():
# Importing two of the same imagae for debugigng purposes
a = cv.imread("Datasets/OTIS/OTIS_PNG_Gray/Fixed Patterns/Pattern1/Pattern1_001.png", cv.IMREAD_GRAYSCALE)
b = cv.imread("Datasets/OTIS/OTIS_PNG_Gray/Fixed Patterns/Pattern1/Pattern1_001.png", cv.IMREAD_GRAYSCALE)
s = [a, b]
avg = [[0] * len(a[0])] * len(a)
print(f"rows: {len(a)} cols: {len(a[0])}")
print(f"rows: {len(avg)} cols: {len(avg[0])}")
for i in range(len(a)):
for j in range(len(a[0])):
# print(f"({i}, {j}): {temp_mean(s, i, j)}")
avg[i][j] = temp_mean(s, i, j) / 255
avim = np.array(avg)
print(f"rows: {len(avim)} cols: {len(avim[0])}")
cv.imshow("title", avim)
cv.waitKey(0)
def temp_mean(seq: List[List[List[any]]], i: int, j: int):
out = 0
for im in seq:
out = im[i][j]
return out / len(seq)
if __name__ == '__main__':
main()
源影像:

生成的影像:

uj5u.com熱心網友回復:
這里的問題是 avg 是 a 的淺拷貝,由 * 乘法創建。這意味著 avg 包含對 a 中同一行的多個參考,因此當您更新 avg[i][j] 時,您實際上也在修改 a[i][j]。結果是 avg 的每一行最終都包含相同的值 - 您修改的 a 的最后一行。要解決此問題,請使用以下命令創建 a 的深層副本:avg = [row[:] for row in a]
這將為每一行創建一個新串列,從而產生可以獨立修改的不同資料
uj5u.com熱心網友回復:
您的問題很可能avg被定義為一個串列的副本串列。當您更新一個串列(行)時,您將全部更新。因此,輸出影像具有所有相同的行。
您確實應該使用 NumPy 陣列來表示影像:
avg = np.zeros(a.shape)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522433.html
上一篇:numpy使用多個條件進行切片,其中一個條件搜索元素的鄰域
下一篇:將彩色掃描影像轉換為黑白影像
