python 그림 의 색상 을 빠르게 바 꿉 니 다.

최근 에 이미지 데 이 터 를 처리 할 때 그림 의 특정한 색 을 다른 색 으로 바 꿔 야 합 니 다.그러나 인터넷 에서 찾 은 방법 은 모두 그림 의 옮 겨 다 니 는 것 을 통 해 바 꾸 는 것 입 니 다.너무 오래 걸 립 니 다!처음에 사용 할 때 CPU 가 매우 빠르다 고 생각 했 습 니 다.한 장의 그림 은 오래 걸 리 지 않 을 것 같 지만 실제 사용 하 는 데 시간 이 걸 리 는 것 은 정말 받 아들 이기 어렵 습 니 다!그래서 스스로 교체 프로그램 을 써 서 속 도 를 올 렸 습 니 다.옮 겨 다 니 는 것 보다 훨씬 빠 르 지만 가장 빠 른 것 이 아니 라 행렬 색인 을 통 해 더 빠 른 처리 방식 이 있어 야 한다 고 생각 합 니 다.다만 저 는 어떻게 실현 해 야 할 지 모 르 겠 습 니 다.나중에 실현 할 수 있다 면 업 데 이 트 를 하고 잠시 사용 할 수 있다 고 생각 하 는 코드 를 적어 야 합 니 다.
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 은 이미지 의 빠 른 교 체 를 실현 합 니 다.어떤 색 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기