web-dev-qa-db-ja.com

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)

2番目の例(すばやく)

hsv += value

この例は非常に高速ですが、HSVのすべての値を変更します(V(輝度)のみを変更する必要があります)

13
Pavel

Slice 3番目のチャネルのみを選択し、それらの要素を変更します-

hsv[:,:,2] += value
16
Divakar

私はこの質問が少し古いことを知っていますが、私のために働いた完全なソリューションを投稿するかもしれないと思いました(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)
18
Bill Grates

変更を行うためにイメージ全体を反復処理することは、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)
7
ZdaR

他の答えは、あらゆる種類のnumpyマジックを使用して飽和を「手で」行うことを示唆していますが、 cv2.add() を使用してOpenCVにそれを処理させることもできます:

import cv2
import numpy as np

image = cv2.read('image.png')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
value = 42 #whatever value you want to add
cv2.add(hsv[:,:,2], value, hsv[:,:,2])
image = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('out.png', image)
6
Gui Meira
def change_brightness(img, alpha, beta):
   return cv2.addWeighted(img, alpha, np.zeros(img.shape, img.dtype),0, beta)

ここで、アルファとベータは入力パラメーターです。入力画像の各ピクセルは、この式に従って変化します。

 alpha(pixel_value) + beta.

2または3のようなアルファの低い値が良い

1
Vikas
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()
1
Rendicahya

これが誰かに役立つことを願って

@Divakarの答え Python、OpenCV:UINT8配列をオーバーフローさせずに画像の輝度を上げる

mImage = cv2.imread('image1.jpg')

hsvImg = cv2.cvtColor(mImage,cv2.COLOR_BGR2HSV)

value = 0

vValue = hsvImg[...,2]
hsvImg[...,2] = np.where((255-vValue)<value,255,vValue+value)

plt.subplot(111), plt.imshow(cv2.cvtColor(hsvImg,cv2.COLOR_HSV2RGB))
plt.title('brightened image'), plt.xticks([]), plt.yticks([])
plt.show()

明るさを下げるには

mImage = cv2.imread('image1.jpg')

hsvImg = cv2.cvtColor(mImage,cv2.COLOR_BGR2HSV)

# decreasing the V channel by a factor from the original
hsvImg[...,2] = hsvImg[...,2]*0.6

plt.subplot(111), plt.imshow(cv2.cvtColor(hsvImg,cv2.COLOR_HSV2RGB))
plt.title('brightened image'), plt.xticks([]), plt.yticks([])
plt.show()

この関数を使用して、希望する C++を使用した明るさまたはコントラスト を変更できます。これは、photoshopまたは他の同様の写真編集ソフトウェアで行うのと同じ方法です。

_def apply_brightness_contrast(input_img, brightness = 255, contrast = 127):
    brightness = map(brightness, 0, 510, -255, 255)
    contrast = map(contrast, 0, 254, -127, 127)

    if brightness != 0:
        if brightness > 0:
            shadow = brightness
            highlight = 255
        else:
            shadow = 0
            highlight = 255 + brightness
        alpha_b = (highlight - shadow)/255
        gamma_b = shadow

        buf = cv2.addWeighted(input_img, alpha_b, input_img, 0, gamma_b)
    else:
        buf = input_img.copy()

    if contrast != 0:
        f = float(131 * (contrast + 127)) / (127 * (131 - contrast))
        alpha_c = f
        gamma_c = 127*(1-f)

        buf = cv2.addWeighted(buf, alpha_c, buf, 0, gamma_c)

    cv2.putText(buf,'B:{},C:{}'.format(brightness,contrast),(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    return buf

def map(x, in_min, in_max, out_min, out_max):
    return int((x-in_min) * (out_max-out_min) / (in_max-in_min) + out_min)
_

その後、cv2.createTrackbar()を使用してトラックバーを作成して関数を呼び出し、適切なパラメーターを使用して上記の関数を呼び出す必要があります。 -255〜+255の範囲の輝度値と-127〜+127のコントラスト値をマップするには、そのmap()関数を使用できます。 python implementation here の詳細を確認できます。

0

古すぎるかもしれませんが、私はcv.covertToを使用しています

Mat resultBrightImage;    
origImage.convertTo(resultBrightImage, -1, 1, percent); // Where percent = (int)(percent_val/100)*255, e.g., percent = 50 to increase brightness by 50%

convertToは、オーバーフローを回避するために最後にsaturate_castを使用します。私はPythonを使用せず、上記はC++で記述されていますが、Python

0
Bilal

これはそれほど難しくなく、画像の明るさを調整する必要があることを知っています。また、すでにたくさんの素晴らしい答えがあります。 @BillGratesの答えを強化したいので、グレースケール画像で動作し、輝度を下げても動作します:value = -255は黒い画像を作成しますが、value = 255白いもの。

def adjust_brightness(img, value):
    num_channels = 1 if len(img.shape) < 3 else 1 if img.shape[-1] == 1 else 3
    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) if num_channels == 1 else img
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)

    if value >= 0:
        lim = 255 - value
        v[v > lim] = 255
        v[v <= lim] += value
    else:
        value = int(-value)
        lim = 0 + value
        v[v < lim] = 0
        v[v >= lim] -= value

    final_hsv = cv2.merge((h, s, v))

    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if num_channels == 1 else img
    return img
0
oezguensi