मैं एक ग्रेस्केल छवि की लपट को बदलने पर काम कर रहा हूँ। हालांकि, जब मैंने प्रत्येक पिक्सेल मान में 100 जोड़ने का प्रयास किया और मान 255 से अधिक हो जाने पर इसे 255 पर सेट करने का प्रयास किया तो मुझे numpy सरणी का उपयोग करने में समस्या है

import numpy as np
import matplotlib.pyplot as plt
from scipy import misc

for i in range(0, img.shape[0]):
    for j in range(0, img.shape[1]):
        im2[i,j] = img[i,j] + 100
        if im2[i,j] > 255:
            im2[i,j] = 255     

plt.imshow(im2, cmap = 'gray')
plt.show()

ये कोड हैं और मुझे यह कहते हुए एक त्रुटि संदेश मिला है

if im2[i,j] > 255:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

क्या कोई इसमें मेरी मदद कर सकता है?

1
finites 29 मार्च 2018, 17:14

3 जवाब

सबसे बढ़िया उत्तर

यदि आप चाहें, तो आप कोड को सरल बना सकते हैं निम्न तरीके से:

im2 = (np.asarray (img) + 100)
im2[im2>255] = 255

पहली पंक्ति img को numpy array में बदल देगी (यदि img सूची है) और प्रत्येक तत्व में 255 जोड़ देगा।

और लाइन मान को im2 के 255 से बदल देगी यदि यह 255 से अधिक है।

0
Akhilesh 29 मार्च 2018, 14:48

जब आप अपनी त्रुटि The truth value of an array with more than one element is ambiguous के बारे में सोचते हैं, तो यह तार्किक लगता है।

आप यह कहने की कोशिश कर रहे हैं क्या मेरी सरणी (जैसे [1, 2, 3]) 255 से बेहतर है? क्या इसकी लंबाई 255 से ऊपर है? क्या आप यह जानने की कोशिश कर रहे हैं कि पहला तत्व श्रेष्ठ है या नहीं? दूसरा ? पूरे सरणी का योग? पूरे सरणी का मूल वर्ग?

आप क्या करना चाहते हैं, अगर मैं आपकी टिप्पणी का सही ढंग से पालन करता हूं, तो यह है:

for idx in range(len(im2[i, j])):
    if im2[i, j][idx] > 255:
        im2[i, j][idx] = 255
0
IMCoins 29 मार्च 2018, 14:33

आप इस उद्देश्य के लिए बस numpy क्लिप फ़ंक्शन का उपयोग कर सकते हैं:

im2 = np.clip(img + 100, 0, 255)

व्याख्या:
पहला तर्क वह सरणी है जिसे आप क्लिप करना चाहते हैं, आपके मामले में img प्रत्येक तत्व में 100 जोड़े गए हैं। दूसरा तर्क न्यूनतम मान है, जो 0 होना चाहिए। तीसरा तर्क अधिकतम मान है, आपके मामले में 255।

2
FlyingTeller 29 मार्च 2018, 14:25