이미지 (jpg / jpeg)의 배경을 흰색으로하고 싶습니다.
아래는 녹색 배경을 흰색으로 전송하는 코드입니다 (사람의 가장자리를 올바르게 식별) : 입력 이미지 를 출력 이미지로
def change_bg(img, bg=(255, 255, 255)):
# convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# threshold using inRange
range1 = (20, 80, 80)
range2 = (90, 255, 255)
mask = cv2.inRange(hsv, range1, range2)
mask = 255 - mask
# apply morphology opening to mask
kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# antialias mask
mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=3, sigmaY=3, borderType=cv2.BORDER_DEFAULT)
mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5, 255), out_range=(0, 255))
result = img.copy()
result[mask == 0] = bg
return result
아래 코드를 사용하여 jpeg 이미지를 png로 변환했지만 투명하지 않은 흰색 픽셀이 표시됩니다. 결과 이미지
def white_to_transe(image):
"""
@input: PIL image
@return:
"""
image = image.convert('RGBA')
# Transparency
newImage = []
for item in image.getdata():
if item[:3] == (255, 255, 255):
newImage.append((255, 255, 255, 0))
else:
newImage.append(item)
image.putdata(newImage)
print(image.mode, image.size)
return newImage
그렇다면 깨끗한 흰색 투명한 배경을 얻는 방법은 무엇입니까?
white_to_transe
아래로 업데이트 하면 작동하지만 흰색 픽셀에 영향을 미칩니다. 예를 들어 흰색 셔츠와 같습니다.
for item in image.getdata():
if item[0] > 240 and item[1] > 240 and item[2] > 240:
newImage.append((255, 255, 255, 0))
흰색 (255 개 모두)을 넣는 대신 투명 change_bg
기능을 추가 할 수 있습니까?
당신의 접근 방식은 다소 불행 할 수 있습니다. 마스크를 앤티 앨리어싱 할 때 범위의 값을 얻지 0 ... 255
만 result[mask == 0] = bg
(흰색) 만 설정 합니다. (점진적으로) 원래 마스크에도 속하는 다른 모든 픽셀은 고려하지 않습니다. 따라서 코드를 다시 정렬하고 최종 마스크를 알파 채널로 사용합니다. OpenCV도 사용했습니다. 추가 필로우 루프를 사용하는 것은 내 관점에서 왠지 번거 롭습니다.
코드에서 발췌 한 내용을 수정 한 것입니다.
import cv2
import numpy as np
import skimage.exposure
img = cv2.imread('rmQRJIS.jpg')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = (40, 80, 80)
upper = (90, 255, 255)
mask = cv2.inRange(img_hsv, lower, upper)
mask = 255 - mask
kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# Use initial, binary mask to set background to white
result = img.copy()
result[mask == 0] = (255, 255, 255)
# Save image just for intermediate output
cv2.imwrite('output_no_trans.png', result)
# Use antialiased mask as final alpha channel for transparency
mask = cv2.GaussianBlur(mask, (0, 0), sigmaX=3, sigmaY=3, borderType=cv2.BORDER_DEFAULT)
mask = skimage.exposure.rescale_intensity(mask, in_range=(127.5, 255), out_range=(0, 255))
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask
# Save final image
cv2.imwrite('output.png', result)
중간 출력으로 배경을 흰색으로 설정 한 후 이미지를 저장했습니다.
알파 채널을 포함한 최종 출력은 다음과 같습니다.
솔직히 여기에서는 PNG
호환성 을 유지하기 위해 업로드하기 전에 출력 이미지를 축소해야했기 때문에 차이점을 거의 볼 수 없습니다 . 결과가 귀하에게 유리하면 전체 크기의 이미지를 직접 살펴보십시오!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
NumPy: 1.20.1
OpenCV: 4.5.1
scikit-image: 0.18.1
----------------------------------------
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다