2011-09-25 11 views
20

एक छवि प्रसंस्करण कक्षा के लिए, मैं मोनोक्रोम छवियों पर बिंदु संचालन कर रहा हूं। पिक्सेल यूंट 8 [0,255] हैं।numpy uint8 पिक्सेल रैपिंग समाधान

numpy uint8 लपेट जाएगा। उदाहरण के लिए, 235 + 30 = 9। मुझे पिक्सल को संतृप्त करने के लिए (अधिकतम = 255) या छंटनी के बजाय truncate (min = 0) की आवश्यकता है।

मेरा समाधान बिंदु गणित के लिए int32 पिक्सेल का उपयोग करता है और फिर छवि को सहेजने के लिए uint8 में परिवर्तित होता है।

क्या यह सबसे अच्छा तरीका है? या क्या कोई तेज तरीका है?

#!/usr/bin/python 

import sys 
import numpy as np 
import Image 

def to_uint8(data) : 
    # maximum pixel 
    latch = np.zeros_like(data) 
    latch[:] = 255 
    # minimum pixel 
    zeros = np.zeros_like(data) 

    # unrolled to illustrate steps 
    d = np.maximum(zeros, data) 
    d = np.minimum(latch, d) 

    # cast to uint8 
    return np.asarray(d, dtype="uint8") 

infilename=sys.argv[1] 
img = Image.open(infilename) 
data32 = np.asarray(img, dtype="int32") 
data32 += 30 
data_u8 = to_uint8(data32) 
outimg = Image.fromarray(data_u8, "L") 
outimg.save("out.png") 

इनपुट छवि:
Riemann

आउटपुट छवि:
Output

उत्तर

27

उपयोग numpy.clip:

import numpy as np 
np.clip(data32, 0, 255, out=data32) 
data_u8 = data32.astype('uint8') 

ध्यान दें कि आप भी इस तरह से numpy बिना छवियों को चमकदार कर सकते हैं:

Import ImageEnhance 
enhancer=ImageEnhance.Brightness(img) 
outimg=enhancer.enhance(1.2) 
outimg.save('out.png') 
+0

np.clip() वास्तव में क्या है मैं की जरूरत है धन्यवाद! मैं ImageEnhance पर भी पढ़ूंगा। होमवर्क खुद को पॉइंट ऑप्स करने के बारे में था लेकिन अन्य तरीकों से सीखना अच्छा होगा। –

1

असल में, यह इससे पहले कि आप जोड़ने की जाँच करने के लिए नीचे आता है। उदाहरण के लिए, अगर आप इस तरह एक समारोह को परिभाषित कर सकते हैं:

def clip_add(arr, amt): 
    if amt > 0: 
     cutoff = 255 - amt 
     arr[arr > cutoff] = 255 
     arr[arr <= cutoff] += amt 
    else: 
     cutoff = -amt 
     arr[arr < cutoff] = 0 
     arr[arr >= cutoff] += amt 
3

आप OpenCV add या subtract कार्य (अतिरिक्त स्पष्टीकरण here) का उपयोग कर सकते हैं।

>>> import numpy as np 
>>> import cv2 
>>> arr = np.array([100, 250, 255], dtype=np.uint8) 
>>> arr 
Out[1]: array([100, 250, 255], dtype=uint8) 
>>> cv2.add(arr, 10, arr) # Inplace 
Out[2]: array([110, 255, 255], dtype=uint8) # Saturated! 
>>> cv2.subtract(arr, 150, arr) 
Out[3]: array([ 0, 105, 105], dtype=uint8) # Truncated! 

दुर्भाग्य से यह उत्पादन सरणी के लिए अनुक्रमित उपयोग करने के लिए असंभव है, प्रत्येक छवि चैनल के लिए इतना inplace गणना इस में किया जा सकता है, कम कुशल, जिस तरह से:

arr[..., channel] = cv2.add(arr[..., channel], 40)