python 그림 의 색상 을 빠르게 바 꿉 니 다.
1.옮 겨 다 니 며 바 꾸 기
그림 의 한 색 을 다른 색 으로 바 꾸 는 일반적인 방법 은 전체 그림 을 옮 겨 다 니 며 하나씩 바 꾸 는 것 입 니 다.다음 과 같 습 니 다.
def replace_color_tran(img, src_clr, dst_clr):
'''
@param img:
@param src_clr: (r,g,b)
@param dst_clr: (r,g,b)
@return
'''
img_arr = np.asarray(img, dtype=np.double)
dst_arr = img_arr.copy()
for i in range(img_arr.shape[1]):
for j in range(img_arr.shape[0]):
if (img_arr[j][i] == src_clr)[0] == True:
dst_arr[j][i] = dst_clr
return np.asarray(dst_arr, dtype=np.uint8)
2.행렬 조작 을 통 해 교체 가속 화하지만 이렇게 하면 처리 속도 가 매우 느리다.저 는 numpy 매트릭스 작업 을 통 해 속 도 를 조금 올 렸 습 니 다.구체 적 인 방법 은 다음 과 같 습 니 다.
그림 의 세 채널 을 R,G,B 세 채널 로 나 눕 니 다.
세 채널 의 데이터 값 을 간단하게 인 코딩 하여 단일 채널 행렬 로 합 친다.
교체 할 색 을 같은 2 로 인 코딩 하고 인 코딩 을 통 해 2 에서 얻 은 행렬 에서 해당 하 는 색 의 색인 을 얻 습 니 다.
3 에서 얻 은 색인 을 이용 하여 R,G,B 세 채널 의 해당 색상 값 을 대상 값 으로 바 꿉 니 다.
얻 은 세 개의 채널 을 하나의 이미지 데이터 로 통합 합 니 다.
구체 적 인 실현 은 다음 과 같다.
def replace_color(img, src_clr, dst_clr):
'''
@param img:
@param src_clr: (r,g,b)
@param dst_clr: (r,g,b)
@return
'''
img_arr = np.asarray(img, dtype=np.double)
r_img = img_arr[:,:,0].copy()
g_img = img_arr[:,:,1].copy()
b_img = img_arr[:,:,2].copy()
img = r_img * 256 * 256 + g_img * 256 + b_img
src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2] #
r_img[img == src_color] = dst_clr[0]
g_img[img == src_color] = dst_clr[1]
b_img[img == src_color] = dst_clr[2]
dst_img = np.array([r_img, g_img, b_img], dtype=np.uint8)
dst_img = dst_img.transpose(1,2,0)
return dst_img
3.결과 대비먼저 구체 적 인 실현 결 과 를 보고 모든 테스트 프로그램의 끝 에 제시 합 니 다.(위의 그림 은 원본 그림 이 고 아래 는 교 체 된 그림 입 니 다)
절차 해석
다음 과 같은 방식 으로 인 코딩 된 이 유 는 r,g,b 삼원 색 의 수치 자체 가 순서 와 관련 이 있 기 때문에 마지막 색인 의 일치 와 정확성 을 확보 하기 위해 서로 다른 수 치 를 엇 갈 리 게 합 니 다.여기 서 magic number 가 256 을 사용 하 는 것 은 삼원 색 의 수치 범위 가[0,255]이기 때 문 입 니 다.이렇게 곱 하면 데이터 가 바 이 너 리 에서 완전히 교차 하 는 것 을 보장 하고 이 인 코딩 이 절대적 으로 정확 하 다 는 것 을 보증 할 수 있 습 니 다.물론 다른 형식의 인 코딩 이나 수치 로 다른 수 치 를 선택 할 수 있 습 니 다.제 가 이렇게 선택 한 것 은 안전 하기 위해 서 입 니 다.
img = r_img * 256 * 256 + g_img * 256 + b_img src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2]\#인 코딩
5.완전한 테스트 프로그램
전체 프로그램:
from PIL import Image
import os
import numpy as np
import time
def replace_color(img, src_clr, dst_clr):
'''
@param img:
@param src_clr: (r,g,b)
@param dst_clr: (r,g,b)
@return
'''
img_arr = np.asarray(img, dtype=np.double)
#
r_img = img_arr[:,:,0].copy()
g_img = img_arr[:,:,1].copy()
b_img = img_arr[:,:,2].copy()
#
img = r_img * 256 * 256 + g_img * 256 + b_img
src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2]
#
r_img[img == src_color] = dst_clr[0]
g_img[img == src_color] = dst_clr[1]
b_img[img == src_color] = dst_clr[2]
#
dst_img = np.array([r_img, g_img, b_img], dtype=np.uint8)
# (h,w,c)
dst_img = dst_img.transpose(1,2,0)
return dst_img
def replace_color_tran(img, src_clr, dst_clr):
'''
@param img:
@param src_clr: (r,g,b)
@param dst_clr: (r,g,b)
@return
'''
img_arr = np.asarray(img, dtype=np.double)
dst_arr = img_arr.copy()
for i in range(img_arr.shape[1]):
for j in range(img_arr.shape[0]):
if (img_arr[j][i] == src_clr)[0] == True:
dst_arr[j][i] = dst_clr
return np.asarray(dst_arr, dtype=np.uint8)
img = '1.jpg'
img = Image.open(img).convert('RGB')
res_img = img.copy()
count = 20
matrix_time = 0
trans_time = 0
for i in range(count):
print(i)
start = time.time()
dst_img = replace_color(img, (8,10,51), (255,0,0))
end = time.time()
matrix_time += (end - start)
start = time.time()
dst_img = replace_color_tran(img, (8,10,51), (255,0,0))
end = time.time()
trans_time += (end - start)
res_img = dst_img
res_img = Image.fromarray(res_img)
res_img.save('2.jpg')
print(' :', matrix_time / count )
print(' :', trans_time / count )
이상 의 python 은 이미지 의 빠 른 교 체 를 실현 합 니 다.어떤 색 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.