溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python+OpenCV實現(xiàn)圖像融合的原理及代碼

發(fā)布時間:2020-09-07 17:58:55 來源:腳本之家 閱讀:306 作者:~沐春風(fēng)~ 欄目:開發(fā)技術(shù)

根據(jù)導(dǎo)師作業(yè)安排,在學(xué)習(xí)數(shù)字圖像處理(剛薩雷斯版)第六章 彩色圖像處理 中的彩色模型后,導(dǎo)師安排了一個比較有趣的作業(yè):

Python+OpenCV實現(xiàn)圖像融合的原理及代碼

融合原理為:

1 注意:遙感原RGB圖image和灰度圖Grayimage為測試用的輸入圖像;

2 步驟:(1)將RGB轉(zhuǎn)換為HSV空間(H:色調(diào),S:飽和度,V:明度);

(2)用Gray圖像誒換掉HSV中的V;

(3)替換后的HSV轉(zhuǎn)換回RGB空間即可得到結(jié)果。

書上只介紹了HSI彩色模型,并沒有說到HSV,所以需要網(wǎng)上查找資料。

Python代碼如下:

import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
def caijian(img):#裁剪圖像與否根據(jù)選擇圖像大小而定,調(diào)用了OpenCV函數(shù)
weight=img.shape[0]
height=img.shape[1]
print(“圖像大小為:%d*%d”%(weight,height))
img=cv2.resize(img,(int(weight/2),int(height/2)),interpolation=cv2.INTER_CUBIC)
return(img)
def graytograyimg(img):
grayimg=img1
weight=img.shape[0]
height=img.shape[1]
for i in range(weight):
for j in range(height):
grayimg[i,j]=0.299img[i,j,0]+0.587img[i,j,1]+0.114img[i,j,2]
return(grayimg)
def RGBtoHSV(img):
b,g,r=cv2.split(img)
rows,cols=b.shape
H=np.ones([rows,cols],“float”)
S=np.ones([rows,cols],“float”)
V=np.ones([rows,cols],“float”)
print(“RGB圖像大小:%d*%d”%(rows,cols))
for i in range(0, rows):
for j in range(0, cols):
MAX=max((b[i,j],g[i,j],r[i,j]))
MIN=min((b[i,j],g[i,j],r[i,j]))
V[i,j]=MAX
if V[i,j]0:
S[i,j]=0
else:
S[i,j]=(V[i,j]-MIN)/V[i,j]
if MAXMIN:
H[i,j]=0 # 如果rgb三向量相同,色調(diào)為黑
elif V[i,j]==r[i,j]:
H[i,j]=(60*(float(g[i,j])-b[i,j])/(V[i,j]-MIN))
elif V[i,j]==g[i,j]:
H[i,j]=60*(float(b[i,j])-r[i,j])/(V[i,j]-MIN)+120
elif V[i,j]==b[i,j]:
H[i,j]=60*(float(r[i,j])-g[i,j])/(V[i,j]-MIN)+240
if H[i,j]<0:
H[i,j]=H[i,j]+360
H[i,j]=H[i,j]/2
S[i,j]=255*S[i,j]
result=cv2.merge((H,S,V)) # cv2.merge函數(shù)是合并單通道成多通道
result=np.uint8(result)
return(result)
def graytoHSgry(grayimg,HSVimg):
H,S,V=cv2.split(HSVimg)
rows,cols=V.shape
for i in range(rows):
for j in range(cols):
V[i,j]=grayimg[i][j][0]
newimg=cv2.merge([H,S,V])
newimg=np.uint8(newimg)
return newimg
def HSVtoRGB(img,rgb):
h2,s1,v1=cv2.split(img)
rg = rgb.copy()
rows,cols=h2.shape
r,g,b=0.0,0.0,0.0
b1,g1,r1 = cv2.split(rg)
print(“HSV圖像大小為:%d*%d”%(rows,cols))
for i in range(rows):
for j in range(cols):
h=h2[i][j]
v=v1[i][j]/255
s=s1[i][j]/255
h=h3
hx=int(h/60.0)
hi=hx%6
f=hx-hi
p=v(1-s)
q=v*(1-fs)
t=v(1-(1-f)s)
if hi0:
r,g,b=v,t,p
elif hi1:
r,g,b=q,v,p
elif hi2:
r,g,b=p,v,t
elif hi3:
r,g,b=p,q,v
elif hi4:
r,g,b=t,p,v
elif hi5:
r,g,b=v,p,q
r,g,b=(r255),(g255),(b255)
r1[i][j]=int®
g1[i][j]=int(g)
b1[i][j]=int(b)
rg=cv2.merge([b1,g1,r1])
return rg
img=cv2.imread(“D:/RGB.bmp”)
gray=cv2.imread(“D:/gray.bmp”)
img=caijian(img)
gray=caijian(gray)
grayimg=graytograyimg(gray)
HSVimg=RGBtoHSV(img)
HSgray=graytoHSgry(grayimg,HSVimg)
RGBimg=HSVtoRGB(HSgray,img)
cv2.imshow(“image”,img)
cv2.imshow(“Grayimage”,grayimg)
cv2.imshow(“HSVimage”,HSVimg)
cv2.imshow(“HSGrayimage”,HSgray)
cv2.imshow(“RGBimage”,RGBimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代碼是在盡量不調(diào)用OpenCV函數(shù)的情況下編寫,其目的是熟悉圖像處理原理和Python編程,注釋很少,其中RGB轉(zhuǎn)HSV原理,HSV轉(zhuǎn)RGB原理,在CSDN中都能找到,灰度圖替換HSV中的V原理其實很簡單,看代碼就能明白,不用再找資料。

總結(jié)

以上所述是小編給大家介紹的Python+OpenCV實現(xiàn)圖像融合的原理及代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI