OpenCV의 imshow
는 기본적으로 투명 배경 을 검은 색으로 보여주기 때문에,
png 파일의 검은색 글자는 안보임.
이를 위해서는 배경과 전경을 구분하는 mask를 만들고, 배경을 흰색과 같이 원하는 색으로 처리해줘야 함.
Code
다음 코드를 참고.
import cv2
import numpy as np
url = 'https://raw.githubusercontent.com/dsaint31x/OpenCV_Python_Tutorial/master/images/opencv_logo.png'
import requests
t0 = requests.get(url)# requests.models.Response
t1 = t0.content # bytes (immutable)
t2 = bytearray(t1) # bytearray (mutable)
t3 = np.asarray(t2, dtype=np.uint8) #ndarray
img = cv2.imdecode(t3, cv2.IMREAD_UNCHANGED)
cv2.imwrite('opencv_logo.png', img)
print(f'{img.shape=}')
# cv2에서는 투명 배경을 검은색으로 표시하는데, 이 경우 검정색 글자가 안보임.
# 때문에 alpha 채널을 읽어서 투명 배경을 흰색으로 변환.
if len(img) > 3 and img.shape[2] == 4:
bgr = img[:,:,:3]
alpha = img[:,:,3]
w_bg = np.ones_like(bgr, dtype=np.uint8) * 255
mask = alpha[:,:,np.newaxis] / 255.
img0 = bgr*mask + w_bg*(1.-mask)
img1 = cv2.convertScaleAbs(bgr*mask + w_bg*(1-mask))
else:
img1 = img
cv2.imshow('test1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.convertScaleAbs()
위에서 사용된 cv2.convertScaleAbs()
는
$$\text{dst}(i,j) = \text{saturate}(| \alpha \text{src}(i,j) + \beta|)$$
cv2
에서 위의 이미지 연산 후 결과값을uint8
형식으로 변환.
- 절대값 처리
- 밝기($\beta$)와 대비($\alpha$ 조정을 하는데 사용됨.
- saturate는 [0,255]의 범위로 값을 제한한다.
주로 연산으로 처리후 보여주기 직전에 호출되는 함수임 (자동 조정은 아님).
같이보면 좋은 자료들
2024.09.23 - [Programming/DIP] - [DIP] cv2.convertSacleAbs(): contrast, brightness 수동조정
2022.09.21 - [Programming/DIP] - [DIP] opencv에서 URL로 이미지 로딩
2022.09.21 - [Programming/DIP] - [DIP] Color Space or Color Model
'Programming > DIP' 카테고리의 다른 글
[DIP] Image 다루기: 기본편 1; (Summary) (0) | 2024.09.22 |
---|---|
[DIP] cv2.imwrite (1) | 2024.09.22 |
[CV] cv2.imread() (4) | 2024.09.16 |
[DIP] plt.imshow: matplotlib.pyplot (1) | 2024.09.16 |
[DIP] cv2.imshow 사용예 (2) | 2024.09.16 |