High Dynamic Range(HDR)는 image나 video에서 Dynamic Range를 넓혀서,
밝은 부분과 어두운 부분의 contrast를 더 넓은 범위로 표현할 수 있게 해주는 기술임.
https://www.youtube.com/watch?v=95DNdbxaIXE
읽어볼 자료
https://news.skhynix.co.kr/post/hdr-great-images
살펴보기
HDR의 주요 특징과 장점은 다음과 같습니다:
- 넓은 밝기 범위 (Wide Brightness Range):
- HDR은 매우 밝은 영역부터 매우 어두운 영역까지 더 많은 세부 정보를 촬영 및 표시를 할 수 있음.
- 향상된 대비 (Enhanced Contrast):
- 이미지의 전반적인 대비 (overall contrast)가 개선됨.
- 카메라에서 사용되는 광센서의 dynamic range 가 인간의 눈보다 떨어지는데 이를 개선하여 더 생생하고 현실적인 이미지를 만들어냄.
- 더 많은 색상:
- HDR은 더 넓은 색 공간(wider color space)을 사용
- 더 풍부하고 정확한 색상을 표현할 수 있음.
- 과도 노출과 노출 부족 방지 (Prevention of Over- and Under-Expsoure):
- 밝은 부분이 과도 노출되거나
- 어두운 부분이 노출 부족되는 문제를 개선.
구현방식
HDR은 주로 두 가지 방식으로 구현됨:
- 여러 장의 사진 합성:
- 서로 다른 노출(exposure) 설정으로 여러 장의 사진을 촬영.
- 이를 합성하여 HDR 이미지를 생성: crf를 계산하여 이를 기반으로 hdr을 구현.
- 움직이는 대상이 있을 경우, ghost distortion이 발생.
- 센서 기술:
- 최신 카메라와 스마트폰은 한 번의 촬영으로 HDR 이미지를 만들 수 있는 센서 기술: single-shot HDR.
- 각 pixel마다 다른 exposure가 가능: Assorted Pixels for Single Shot HDR
Tone Mapping
HDR 기술을 통해 wide dynamic range의 image data를 획득하더라도, contrast가 제한(표현 가능한 dynamic range가 제한)된 표준 디스플레이에서 효과적으로 표현하려면 Tone mapping 기술이 필요함.
(Tone = Brightness + Saturation)
Example
openCV를 이용하여 HDR image를 생성하는 예제 코드임.
가장 이론적인 Debevec 알고리즘을 사용하였고, 표시를 위한 tone-mapping은 Reinhard 알고리즘을 사용함.
(openCV4.10의 경우, Durand 알고리즘의 경우 특허 문제로 openCV를 다시 컴파일해야해서... Reinhard 알고리즘을 사용함.)
import cv2
import numpy as np
from PIL import Image
from PIL.ExifTags import TAGS
TAGS_RESERVED = {v:k for k,v in TAGS.items()}
EXPOSURE_TIME_TAG = TAGS_RESERVED.get('ExposureTime')
def get_exposure_time(img_path):
with Image.open(img_path) as img:
exif_data = img._getexif()
exposure = exif_data.get(EXPOSURE_TIME_TAG,-1.)
return exposure
def main():
img_names = ['33','100','179','892','1560','2933']
exposures = []
imgs = []
for img in img_names:
img_path = f'./{img}.jpg'
exposure = get_exposure_time(img_path)
if exposure > 0:
exposures.append(exposure)
imgs.append(cv2.imread(img_path, cv2.IMREAD_COLOR))
exposures = np.array(exposures).astype(np.float32)
calibrate = cv2.createCalibrateDebevec()
response = calibrate.process(imgs, exposures)
merge_debevec = cv2.createMergeDebevec()
hdr_img = merge_debevec.process(imgs, exposures, response)
print(np.max(hdr_img), np.min(hdr_img),hdr_img.dtype)
tmp = cv2.normalize(hdr_img, None, 0, 1, cv2.NORM_MINMAX)
# tonemap = cv2.createTonemapDurand(gamma=2.2)
tonemap = cv2.createTonemapReinhard(gamma=2.2)
ldr_img = tonemap.process(hdr_img)
ldr_img = cv2.normalize(ldr_img, None, 0, 1, cv2.NORM_MINMAX)
cv2.namedWindow('hdr_img w/ tonemap',cv2.WINDOW_NORMAL)
cv2.imshow('hdr_img w/ tonemap', ldr_img)
cv2.resizeWindow('hdr_img w/ tonemap', 400,300)
cv2.namedWindow('hdr_img w/o tonemap',cv2.WINDOW_NORMAL)
cv2.imshow('hdr_img w/o tonemap', tmp)
cv2.resizeWindow('hdr_img w/o tonemap', 400,300)
cv2.waitKey()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
결과는 다음과 같음.
위의 코드는 아래의 exposure가 다른 영상들을 사용함.
https://github.com/PacktPublishing/OpenCV-3-Computer-Vision-with-Python-Cookbook
Assorted Pixels
Assorted Pixels 기법은 Single Shot HDR 기술 중 하나로, 전통적인 HDR 촬영 방식과는 달리 단 한 번의 촬영으로 넓은 다이내믹 레인지를 가진 이미지를 생성하는 방법임.
이 기법은 특히 움직이는 장면에서 고해상도의 HDR 이미지를 얻기 위해 사용되며, single shot(단일 촬영)으로 다양한 노출 정보를 효과적으로 캡처할 수 있음.
"Assorted Pixels"라는 이름이 붙은 이유는 다음과 같음:
- Assorted Pixels의 경우, 이미지 센서의 각 픽셀이 서로 다른 감도를 가지도록 제조 과정에서 고정됨.
- "Assorted"는 "다양한" 또는 "혼합된"이라는 의미로, 하나의 이미지 내에서 다양한 노출 조건을 가진 픽셀들이 함께 존재한다는 점을 나타냄.
- 즉, 일부 픽셀은 낮은 감도로, 다른 픽셀은 중간 감도로, 또 다른 픽셀은 높은 감도로 동작하여 "다양한(Assorted)" 픽셀들이 모여 있는 것을 의미함.
이러한 "다양한 픽셀들"의 조합을 통해 single-shot으로 넓은 다이내믹 레인지를 가진 HDR 이미지를 생성할 수 있음.
Assorted Pixels 기법의 원리
Assorted Pixels 기법의 핵심은
이미지 센서의 각 픽셀이 서로 다른 감도를 가지도록 제조 과정에서 고정되는 것임.
이 방식의 특징을 전통적인 이미지 센서와 비교하면 다음과 같음:
- 전통적인 이미지 센서:
- 모든 픽셀이 동일한 노출 조건에서 이미지를 캡처함.
- Assorted Pixels 센서: 각 픽셀이 서로 다른 노출 조건을 가짐.
- 일부 픽셀은 낮은 감도로 설정됨.
- 다른 픽셀은 중간 감도로 동작함.
- 또 다른 픽셀은 높은 감도로 동작함.
이로 인해 하나의 이미지 내에서 다양한 노출 조건을 가진 픽셀들이 함께 존재하게 됨. 이러한 노출의 다양성을 통해 단일 촬영으로 밝은 부분과 어두운 부분의 디테일을 모두 캡처할 수 있으며, 전체 이미지에서 밝은 영역과 어두운 영역을 동시에 잘 표현할 수 있음.
촬영된 이미지는 후처리 과정에서 각 픽셀의 노출 조건을 고려하여 합성됨.
이 과정에서:
- 적절한 알고리즘이 각 픽셀의 노출을 조정함.
- 전체적인 다이내믹 레인지를 확대함.
- 최종적으로 HDR 이미지를 생성함.
이를 통해 움직임이 있는 장면에서도 깔끔한 HDR 이미지를 얻을 수 있음.
Assorted Pixels 기법의 장점
Assorted Pixels 기법은 여러 장의 이미지를 합성하는 전통적인 HDR 촬영 기법과 달리, single shot으로 다양한 노출을 캡처하기 때문에 다음과 같은 장점을 가짐:
- 유령 현상(ghosting) 방지: 움직임이 있는 장면에서도 문제 발생이 적음.
- 실시간 HDR 이미지 생성: 동영상 촬영이나 라이브 스트리밍과 같은 실시간 응용에 유용함.
Assorted Pixels 기법의 단점
그러나 이 기법은 다음과 같은 단점을 가짐:
- 복잡한 센서 설계: 각기 다른 노출 조건을 가진 픽셀을 생성하기 위해 정밀한 설계가 필요함.
- 고급 후처리 알고리즘 필요: 다양한 노출 조건을 가진 픽셀 데이터를 통합하여 자연스러운 HDR 이미지를 생성하기 위해 복잡한 알고리즘이 요구됨.
같이 보면 좋은 자료들
2024.09.03 - [Programming/DIP] - [CV] Camera Response Function
2024.09.01 - [Programming/DIP] - [CV] Dynamic Range란?
'Programming > DIP' 카테고리의 다른 글
[CV] Sharpness (선예도) (0) | 2024.09.05 |
---|---|
[CV] Brightness vs. Intensity (0) | 2024.09.05 |
[CV] Camera Response Function (3) | 2024.09.03 |
[CV] Dynamic Range 란? (2) | 2024.09.01 |
[CV] 공간해상도로 본 광센서와 디스플레이 디바이스 발전사 (2) | 2024.09.01 |