我正在嘗試灰度切片。
這是我的全部代碼,我試圖在不影響背景的情況下將影像轉換成灰度:
def without_background(img_path, save_path)。
image = Image.open(img_path)
img_array = np.array(image,dtype=np.uint8)
img_shape=(image.width,image.height)
顯示(影像)
for i in range(img_shape[1]) 。
for j in range(img_shape[0]) 。
v = img_array[i][j] 。
if(v>=0 and v<=50) 。
print(img_array[i][j]
img_array[i][j]=255。
else:
img_array[i][j]=0。
resultImage = Image.fromarray(img_array)
resultImage.save(save_path)
顯示(resultImage)
這是個錯誤:
ValueError Traceback (most recent call last)
<ipython-input-23-a6d36de00a06> in < module> ()
2 for j in range(img_shape[0] )。)
3 v = img_array[i][j] 。
----> 4 if(v>=0 and v<=50) 。
5 print(img_array[i][j])
ValueError。一個陣列的真值有多個元素是不明確的。使用a.any() 或 a.all()
uj5u.com熱心網友回復:
影像有三個維度。看到這個例子你就知道你錯在哪里了。如果你想檢查v,你需要像下面這樣遍歷v:
from PIL import Image
image = Image.open('1.png'/span>)
img_array = np.array(image,dtype=np.uint8)
print(img_array.shape) # (820, 892, 4)
img_shape=(image.width,image.height)
for i in range(img_shape[1]) 。
for j in range(img_shape[0]) 。
v = img_array[i][j] 。
print(type(v.shape) # <class 'tuple' >
for k in v: # 添加這一行
if (k>=0 and k<=50) 。
print(img_array[i][j])
img_array[i][j]=255。
else:
img_array[i][j]=0。
uj5u.com熱心網友回復:
在你的例子中img_array[i][j]回傳一個np.array(而不僅僅是一個單一的值),因為它回傳像素的RGB值。
如果你的影像已經是灰度的,并且所有3個值都是相同的,你可以只取例如第一個值(紅色),像這樣:
v = img_array[i][j][0]
如果你的影像還不是灰度的,你可能想取每個值的平均數:
v = img_array[i][j].mean()
......或者有可能對它做一些更復雜的數學運算。
這個錯誤實際上意味著什么。
讓我們來看看這個小例子:
arr = np.array(range(4)
arr
array([0, 1, 2, 3] )
arr > 1
array([False, False, True, True] )
我們從這個比較中得到的不僅僅是一個布林值,而是一個全新的np.array,其中充滿了每一次比較的結果。基本上像這樣展開:
[0 > 1, 1 >。1, 2 > 1, 3 > 1 ]
當你現在試圖將這個np.array轉換成一個單一的布林值時...
>>> if arr > 1: # 這基本上是: bool(arr > 1)。
... pass
...
回溯(最近一次呼叫)。
檔案"<stdin>",行1,in<module>。
ValueError。一個陣列的真值有多個元素是不明確的。使用a.any() 或 a.all()
......你得到的正是這個錯誤。
你有兩個選擇。
你有兩個選擇,錯誤資訊友好地提供給你:
你有兩個選擇。
- 使用
(arr > 1).all(),如果所有值都大于1,則為真。 - 使用
(arr > 1).any(),如果any值大于1,則為真。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320322.html
標籤:
上一篇:C 設定視窗文本問題
