欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 實現(xiàn)圖像快速替換某種顏色

 更新時間:2020年06月04日 11:25:25   作者:grayondream  
這篇文章主要介紹了python 實現(xiàn)圖像快速替換某種顏色,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近的對圖像數(shù)據(jù)進行處理的時候需要將圖像中的某個顏色替換為另一個顏色,但是網(wǎng)絡(luò)上找到的方法都是通過對圖像的遍歷進行替換,實在是太費時了!剛開始使用時覺得CPU很快了,一張圖片應(yīng)該用不了多久,但是實際使用中耗時確實難以接受的!于是自己寫了一個替換程序加快速度,比遍歷快很多,但我覺得不是最快的,應(yīng)該有通過矩陣索引更快的處理方式,只是我自己暫時并不知道該如何實現(xiàn),如果以后能夠?qū)崿F(xiàn)會進行更新,暫時先寫下自己暫時覺得可用的代碼。

一、通過遍歷替換

將圖像中某個顏色替換為另一個顏色一般的做法是遍歷整個圖像,逐一替換,如下:

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)

二、通過矩陣操作加快替換

但是這樣做,處理速度是很慢的即便是現(xiàn)在CPU很快的情況下。我自己通過numpy矩陣操作將速度提升了一點,具體做法如下:

將圖像的三個通道拆分開來為R,G,B三個通道

將三個通道的數(shù)據(jù)值進行簡單的編碼,合并為單通道矩陣;

將需要替換的顏色進行同2的編碼,利用改編碼在2中得到的矩陣中得到對應(yīng)顏色的索引;

利用3中得到的索引將R,G,B三個通道中的對應(yīng)顏色值替換為目標值;

將得到的三個通道合并為一個圖像數(shù)據(jù)。

具體實現(xiàn)如下:

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

三、結(jié)果對比

先看下具體的實現(xiàn)結(jié)果,全部測試程序文末給出,(上面的圖片是原圖,下面是替換后的圖片)。

四、程序解釋

通過如下方式編碼的原因是r,g,b三原色的數(shù)值本身是順序相關(guān)的,為了保證最后索引的一致與準確性,采用將不同數(shù)值錯位開。這里的magic number采用256是因為三原色的數(shù)值的范圍是[0,255],這樣相乘可以保證數(shù)據(jù)在二進制上的完全相互交錯而保證該編碼是絕對正確的,當然也可以采用其他形式的編碼或者數(shù)值選擇其他數(shù)值,我這樣選擇是為了保險起見而已。

img = r_img * 256 * 256 + g_img * 256 + b_img src_color = src_clr[0] * 256 * 256 + src_clr[1] * 256 + src_clr[2] #編碼

五、完整的測試程序

完整的程序:

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)
  #將數(shù)據(jù)轉(zhuǎn)換為圖像數(shù)據(jù)(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 實現(xiàn)圖像快速替換某種顏色就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • matplotlib繪制直方圖的基本配置(萬能模板案例)

    matplotlib繪制直方圖的基本配置(萬能模板案例)

    本文主要介紹了matplotlib繪制直方圖的基本配置(萬能模板案例),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • PyCharm安裝庫numpy失敗問題的詳細解決方法

    PyCharm安裝庫numpy失敗問題的詳細解決方法

    今天使用pycharm編譯python程序時,由于要調(diào)用numpy包,但又未曾安裝numpy,于是就根據(jù)pycharm的提示進行安裝,最后竟然提示出錯,下面這篇文章主要給大家介紹了關(guān)于PyCharm安裝庫numpy失敗問題的詳細解決方法,需要的朋友可以參考下
    2022-06-06
  • python字符串替換re.sub()方法解析

    python字符串替換re.sub()方法解析

    這篇文章主要介紹了python字符串替換re.sub()方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • python自定義封裝帶顏色的logging模塊

    python自定義封裝帶顏色的logging模塊

    大家好,本篇文章主要講的是python自定義封裝帶顏色的logging模塊,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Python利用全連接神經(jīng)網(wǎng)絡(luò)求解MNIST問題詳解

    Python利用全連接神經(jīng)網(wǎng)絡(luò)求解MNIST問題詳解

    這篇文章主要介紹了Python利用全連接神經(jīng)網(wǎng)絡(luò)求解MNIST問題,結(jié)合實例形式詳細分析了單隱藏層神經(jīng)網(wǎng)絡(luò)與多層神經(jīng)網(wǎng)絡(luò),以及Python全連接神經(jīng)網(wǎng)絡(luò)求解MNIST問題相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解

    Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解

    這篇文章主要為大家介紹了Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Python中的__new__與__init__魔術(shù)方法理解筆記

    Python中的__new__與__init__魔術(shù)方法理解筆記

    這篇文章主要介紹了Python中的__new__與__init__魔術(shù)方法理解筆記,需要的朋友可以參考下
    2014-11-11
  • pd.drop_duplicates刪除重復(fù)行的方法實現(xiàn)

    pd.drop_duplicates刪除重復(fù)行的方法實現(xiàn)

    drop_duplicates 方法實現(xiàn)對數(shù)據(jù)框 DataFrame 去除特定列的重復(fù)行,本文主要介紹了pd.drop_duplicates刪除重復(fù)行的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Python實現(xiàn)自動化郵件發(fā)送過程詳解

    Python實現(xiàn)自動化郵件發(fā)送過程詳解

    這篇文章主要介紹了如何利用Python實現(xiàn)自動化郵件發(fā)送,可以讓你擺脫繁瑣的重復(fù)性業(yè)務(wù),可以節(jié)省非常多的時間。感興趣的小伙伴可以試一試
    2022-01-01
  • Python使用pymysql模塊操作mysql增刪改查實例分析

    Python使用pymysql模塊操作mysql增刪改查實例分析

    這篇文章主要介紹了Python使用pymsql模塊操作mysql增刪改查,結(jié)合實例形式分析了Python使用pymsql模塊針對mysql進行增刪改查操作的相關(guān)實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2019-12-12

最新評論