728x90
728x90
OpenCV의 imshow
는 기본적으로 투명 배경을 검은 색으로 보여주기 때문에,
png 파일의 검은색 글자는 안보임.
이를 위해서는 배경과 전경을 구분하는 mask를 만들고, 배경을 흰색과 같이 원하는 색으로 처리해줘야 함.
다음 코드를 참고.
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
에서 이미지 연산 후 결과값을uint8
형식으로 변환하고,- 스케일링 및
- 절대값 처리, 그리고
- 밝기와 대비 조정을 동시에 수행하는 함수.
$$\text{dst}(i,j) = | \alpha \text{src}(i,j) + \beta|$$
주로 연산으로 처리후 보여주기 직전에 호출되는 함수임.
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] cv.imread (4) | 2024.09.16 |
[DIP] plt.imshow: matplotlib.pyplot (1) | 2024.09.16 |
[DIP] cv2.imshow 사용예 (2) | 2024.09.16 |