मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जो नुंबा और CUDA को Python 3.8 के साथ लागू करता है। वर्तमान में, मैं अंतिम छवि के आयामों के साथ एक सरणी बनाता हूं। इसके बाद, मैं एक CUDA कर्नेल (अविश्वसनीय रूप से तेज़) के साथ एक छवि उत्पन्न करता हूं। फिर, मैं पिक्सेल रंग को एक पिलो इमेज (अविश्वसनीय रूप से धीमा) में कॉपी करता हूं। मेरा कोड:

for x in range(width):
    for y in range(height):
        if pixels[x][y] = 0:
            color = [0, 0, 0]
        else:
            # Get color from int as tuple
            color = rgb_conv(pixels[x][y]
        
        red = int(numpy.floor(color[0]))
        if red > 255:
            red = 255
        elif red < 0:
            red = 0

        green = int(numpy.floor(color[1]))
        if green > 255:
            green = 255
        elif green < 0:
            green = 0

        blue = int(numpy.floor(color[2]))
        if blue > 255:
            blue = 255
        elif blue < 0:
            blue = 0

        image.putpixel((x, y), (red, green, blue))

क्या इस कार्यान्वयन के लिए कोई और अधिक कुशल पायथन छवि पुस्तकालय हैं? क्या GPU पर सरणी को किसी छवि में बदलने का कोई तरीका है? दिशा के साथ कोई मदद काम करती है। धन्यवाद!

संपादित करें 1: समारोह rgb_conv के लिए एक अनुरोध किया गया था। यह एक ऐसा फ़ंक्शन है जिसे मैंने एक पूर्णांक को तीन-चौड़े रंग में परिवर्तित करने के लिए पाया।

def rgb_conv(i):
    color = 255 * numpy.array(colorsys.hsv_to_rgb(i / 255.0, 1.0, 0.5))
    return tuple(color.astype(int))

हालांकि, मुझे यह फ़ंक्शन विशेष रूप से पसंद नहीं आया, इसलिए मैंने इसे हटा दिया और निम्नलिखित के साथ काम करना शुरू कर दिया:

pixelArr = image.load()
for x in range(width):
    for y in range(height):
        color = int(numpy.floor(pixels[x][y]))
        pixelArr[x, y] = (color << 21) + (color << 10) + color * 8

यह समायोजन कोड के चलने के समय के लिए बहुत कुछ नहीं करता है। मैं प्रत्येक पिक्सेल को छवि में डालने के बजाय एक सरणी से छवि लोड करने के सुझाव में आगे देख रहा हूं।

1
Spencer Cain 18 फरवरी 2021, 03:40
 – 
Kraigolas
18 फरवरी 2021, 03:53
यहां बहुत अधिक संभावित अनुकूलन है। बस जो किया जा सकता है वह rgb_conv से जो वापस आ सकता है उसका एक कार्य होगा। यह आपका अपना कार्य है, है ना? यदि ऐसा है, तो मैं यह अनुकूलित करने के लिए देख रहा हूं कि वह फ़ंक्शन क्या कर रहा है, उम्मीद है कि आपके द्वारा यहां दिखाए जाने वाले सभी पोस्ट-प्रोसेसिंग की आवश्यकता नहीं है। यदि वह आपका कार्य नहीं है, तो परिणामी "रंग" में क्या हो सकता है, इसकी स्पष्ट परिभाषा प्रदान करना बहुत मददगार होगा। यदि यह आपका कार्य है, तो क्या आप इसे हमें दिखा सकते हैं?
 – 
CryptoFool
18 फरवरी 2021, 05:14
यदि छवि मूल रूप से GPU पर है, तो वहां रूपांतरण करना बहुत अच्छा होगा। यदि आप रूपांतरण करने के लिए इसे GPU पर कॉपी करते हैं, तो मुझे यकीन नहीं है कि यह आपको GPU पर करने के लिए कुछ भी बचाएगा। - फिर, स्रोत छवि प्रारूप वास्तव में क्या है?
 – 
CryptoFool
18 फरवरी 2021, 05:16
1
आपको व्यक्तिगत पिक्सेल को जनहित याचिका के साथ नहीं रखना चाहिए। इमेज में frombytes और frombuffer तरीके हैं जो बहुत तेज़ होंगे।
 – 
g.d.d.c
18 फरवरी 2021, 07:49
खुशी है कि आप इसे काम कर रहे हैं, और स्टैक ओवरफ़्लो में आपका स्वागत है! आपकी "संपादित करें 2" जानकारी नीचे दिए गए आपके उत्तर में बेहतर होगी, न कि यहां प्रश्न में।
 – 
CrazyChucky
20 फरवरी 2021, 19:13

1 उत्तर

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

प्रत्येक पिक्सेल को pillow वाली छवि में रखना प्रभावी नहीं है। एक सुस्पष्ट सरणी से एक छवि बनाना पहले की तुलना में काफी तेज है। तेजी से, मेरा मतलब है कि 3840x2160 छवि में मिनट लगे, लेकिन अब 0.0117 सेकंड लगते हैं।

एक सरणी बनाने के लिए जिसे एक छवि में परिवर्तित किया जा सकता है:

import numpy
pixels = numpy.zeros((height, width, 3), dtype=numpy.uint8)

यहां, मैं पिक्सेल सरणी के साथ एक छवि बनाने के लिए GPU पर गणना चलाता हूं। पिक्सेल की एक सरणी को एक छवि में कुशलता से बदलने के लिए:

from PIL import Image
image = Image.fromarray(pixels)
1
Spencer Cain 20 फरवरी 2021, 19:58