2015-09-16 26 views
7

私は一連の画像を持っています。私はこれらの画像の明るさを平均化する必要があります。python + OpenCVでイメージの明るさを速く変更する方法は?

まず例(非常に遅い):

img = cv2.imread('test.jpg') #load rgb image 
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #convert it to hsv 

for x in range(0, len(hsv)): 
    for y in range(0, len(hsv[0])): 
     hsv[x, y][2] += value 

img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) 
cv2.imwrite("image_processed.jpg", img) 

第二の例(迅速)

hsv += value 

この例は非常に速いが、それは(私は変更する必要があるすべての値のHSVを変更しますV(輝度))

答えて

10

Slice -

hsv[:,:,2] += value 
+1

は動作しません。明るさを上げた後、出力として奇妙な画像を与えます。 –

+0

@ GauravRajオーバーフローする可能性があります。その場合は、['numpy.clip'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.clip.html)のクリッピングを使用する必要があります。また、これがHSV側で動作していることを通知します。したがって、これらのRGBからHSVおよびバック変換を行う必要があります。 – Divakar

+0

はい、私はそれをすべて行いました。 BGRをHSVに、そしてhsv [:、:、2] + = 50、次にnp.clip、最後にHSVをBGRに変更します。まだ運がありません。 –

5

変更を加えるために画像全体を反復することはできませんopencvのスケーラブルなオプションであるOpencvは、与えられたイメージに対して算術演算を実行するための多くのメソッドと関数を提供します。あなたは、単に個々のチャネルに変換HSV画像を分割した後のように応じてVチャネルを処理することができる

:ちょうど第三のチャネルを選択し、それらの要素を変更する

img = cv2.imread('test.jpg') #load rgb image 
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #convert it to hsv 

h, s, v = cv2.split(hsv) 
v += 255 
final_hsv = cv2.merge((h, s, v)) 

img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) 
cv2.imwrite("image_processed.jpg", img) 
2

私はこの質問が少し古いことを知っていますが、私は私のために働いた完全な解決策を投稿するかもしれないと思った(255で飽和することによってオーバーフロー状況を処理する):

次のよう
def increase_brightness(img, value=30): 
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
    h, s, v = cv2.split(hsv) 

    lim = 255 - value 
    v[v > lim] = 255 
    v[v <= lim] += value 

    final_hsv = cv2.merge((h, s, v)) 
    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) 
    return img 

は、これは使用することができます。

frame = increase_brightness(frame, value=20) 
0
import cv2 
import numpy as np 

image = cv2.imread('image.jpg') 
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 

v = image[:, :, 2] 
v = np.where(v <= 255 - increase, v + increase, 255) 
image[:, :, 2] = v 

image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR) 

cv2.imshow('Brightness', image) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 
関連する問題