我正在嘗試處理影像,并且想使影像的黑暗區域變亮。我嘗試了直方圖均衡,但是由于影像中也有一些明亮的區域,結果并不令人滿意。這就是為什么我正在尋找一種方法來只照亮影像的黑暗區域。
例如,輸入影像在左邊,預期結果在右邊,女孩的頭發和臉都變亮了

ImageMagick 似乎提供了一些實作這一點的可能性,但是,我想用 python 來做
uj5u.com熱心網友回復:
如果你想避免顏色失真,你可以:
- 轉換為 HSV 色彩空間,
- 拆分渠道,
- 提升 V(值)通道
- 重組渠道
- 節省
這可能是這樣的:
from PIL import Image
# Open the image
im = Image.open('hEHxh.jpg')
# Convert to HSV colourspace and split channels for ease of separate processing
H, S, V = im.convert('HSV').split()
# Increase the brightness, or Value channel
# Change 30 to 50 for bigger effect, or 10 for smaller effect
newV = V.point(lambda i: i int(30*(255-i)/255))
# Recombine channels and convert back to RGB
res = Image.merge(mode="HSV", bands=(H,S,newV)).convert('RGB')
res.save('result.jpg')

本質上,我正在將亮度從黑色映射更改為綠色映射:

提醒健忘的自己...... “你做了這樣的情節,馬克”:
import matplotlib.pyplot as plt
import numpy as np
# Generate some straight-line data
xdata = np.arange(0,256)
# And the new mapping
ydata = xdata 30*(255-xdata)/255
# Plot
plt.plot(xdata,xdata,'.k')
plt.plot(xdata,ydata,'g^')
plt.title('Adjustment of V')
plt.xlabel('Input V')
plt.ylabel('Output V')
plt.grid(True)
plt.show()
uj5u.com熱心網友回復:
這是在 Imagemagick 和 Python/OpenCV 中執行此操作的一種方法。使用三角形方法對 LAB 顏色空間的 L 通道進行閾值化。然后使整個影像變亮。然后使用閾值作為掩碼合并原始影像和加亮影像。
影像魔術:
magick girl_on_chair.jpg \
\( -clone 0 -colorspace LAB -channel 0 -separate channel \
-auto-threshold triangle -negate write thresh.png \) \
\( -clone 0 -evaluate multiply 4 \) \
swap -compose over -composite \
girl_on_chair_processed.jpg
臨界點:

結果:

Python/OpenCV:
import cv2
import numpy as np
# read image
img = cv2.imread("girl_on_chair.jpg")
# convert to LAB and extract L channel
LAB = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
L = LAB[:,:,0]
# threshold L channel with triangle method
value, thresh = cv2.threshold(L, 0, 255, cv2.THRESH_BINARY cv2.THRESH_TRIANGLE)
print(value)
# threshold with adjusted value
value = value 10
thresh = cv2.threshold(L, value, 255, cv2.THRESH_BINARY)[1]
# invert threshold and make 3 channels
thresh = 255 - thresh
thresh = cv2.merge([thresh, thresh, thresh])
gain = 3
blue = cv2.multiply(img[:,:,0], gain)
green = cv2.multiply(img[:,:,1], gain)
red = cv2.multiply(img[:,:,2], gain)
img_bright = cv2.merge([blue, green, red])
# blend original and brightened using thresh as mask
result = np.where(thresh==255, img_bright, img)
# save result
cv2.imwrite('girl_on_chair_thresh.jpg', thresh)
cv2.imwrite('girl_on_chair_brighten.jpg', result)
cv2.imshow('img', img)
cv2.imshow('L', L)
cv2.imshow('thresh', thresh)
cv2.imshow('img_bright', img_bright)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
臨界點:

結果:

uj5u.com熱心網友回復:
cv2以下是僅使用模塊即可完成此操作的方法:
import cv2
def lighten(img, value=30):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
v = hsv[..., 2]
v[:] = cv2.add(v, value)
return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
mask = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY)[1] == 0
img[mask] = lighten(img)[mask]
cv2.imshow("result", img)
cv2.waitKey(0)
輸入影像和輸出影像:

uj5u.com熱心網友回復:
在 Imagemagick 中執行此操作的另一種方法是使用 -fx 設定閾值并使用 LAB 的 L 通道或 YCbCr 的 Y 通道或 HSV 的 V 通道通過在該通道小于某個閾值時添加一個常數值來增加亮度。
(注意:在 -fx 中,影像u的范圍從 0 到 1 不等。)
magick girl_on_chair.jpg \
-colorspace LAB -separate \
\( -clone 0 -fx "u<0.15?u 0.15:u" \) \
-swap 0,3 delete \
-set colorspace LAB -combine -colorspace sRGB \
girl_on_chair_proc2.jpg
magick girl_on_chair.jpg \
-colorspace YCBCR -separate \
\( -clone 0 -fx "u<0.15?u 0.15:u" \) \
-swap 0,3 delete \
-set colorspace YCBCR -combine -colorspace sRGB \
girl_on_chair_proc3.jpg
magick girl_on_chair.jpg \
-colorspace HSV -separate \
\( -clone 2 -fx "u<0.15?u 0.15:u" \) \
swap delete \
-set colorspace HSV -combine -colorspace sRGB \
girl_on_chair_proc4.jpg
實驗室結果:

YCbCr 結果:

HSV 結果:

可以使用 Python/OpenCV 進行類似的處理,如下所示:
import cv2
import numpy as np
# read image
img = cv2.imread("girl_on_chair.jpg")
# convert to LAB and extract L channel
LAB = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
L,A,B = cv2.split(LAB)
# process L channel
L_proc = np.where(L<40, cv2.add(L,40), L)
# recombine L_proc with A and B
LAB_new = cv2.merge([L_proc, A, B])
# convert back to BGR
result = cv2.cvtColor(LAB_new, cv2.COLOR_LAB2BGR)
# save result
cv2.imwrite('girl_on_chair_brighten2.jpg', result)
cv2.imshow('img', img)
cv2.imshow('L', L)
cv2.imshow('L_proc', L_proc)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478323.html
