电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:30日期:2022-07-22 18:47:09

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

一、通過遍歷替換

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

def replace_color_tran(img, src_clr, dst_clr):’’’ 通過遍歷顏色替換程序@paramimg:圖像矩陣@paramsrc_clr:需要替換的顏色(r,g,b)@paramdst_clr:目標(biāo)顏色(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_clrreturn np.asarray(dst_arr, dtype=np.uint8)

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

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

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

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

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

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

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

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

def replace_color(img, src_clr, dst_clr):’’’ 通過矩陣操作顏色替換程序@paramimg:圖像矩陣@paramsrc_clr:需要替換的顏色(r,g,b)@paramdst_clr:目標(biāo)顏色(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é)果對(duì)比

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

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

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

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

四、程序解釋

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

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

五、完整的測(cè)試程序

完整的程序:

from PIL import Imageimport osimport numpy as npimport timedef replace_color(img, src_clr, dst_clr):’’’ 通過矩陣操作顏色替換程序@paramimg:圖像矩陣@paramsrc_clr:需要替換的顏色(r,g,b)@paramdst_clr:目標(biāo)顏色(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_imgdef replace_color_tran(img, src_clr, dst_clr):’’’ 通過遍歷顏色替換程序@paramimg:圖像矩陣@paramsrc_clr:需要替換的顏色(r,g,b)@paramdst_clr:目標(biāo)顏色(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_clrreturn np.asarray(dst_arr, dtype=np.uint8)img = ’1.jpg’img = Image.open(img).convert(’RGB’)res_img = img.copy()count = 20matrix_time = 0trans_time = 0for 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_imgres_img = Image.fromarray(res_img)res_img.save(’2.jpg’)print(’矩陣操作花費(fèi)時(shí)間:’, matrix_time / count )print(’遍歷操作花費(fèi)時(shí)間:’, trans_time / count )

以上這篇python 實(shí)現(xiàn)圖像快速替換某種顏色就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 宝鸡市人民医院| ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 酸度计_PH计_特斯拉计-西安云仪| 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 搬运设备、起重设备、吊装设备—『龙海起重成套设备』 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 |