根據導師作業安排,在學習數字圖像處理(剛薩雷斯版)第六章 彩色圖像處理 中的彩色模型后,導師安排了一個比較有趣的作業:
融合原理為:
1 注意:遙感原rgb圖image和灰度圖grayimage為測試用的輸入圖像;
2 步驟:(1)將rgb轉換為hsv空間(h:色調,s:飽和度,v:明度);
(2)用gray圖像誒換掉hsv中的v;
(3)替換后的hsv轉換回rgb空間即可得到結果。
書上只介紹了hsi彩色模型,并沒有說到hsv,所以需要網上查找資料。
python代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
import cv2 import numpy as np import math from matplotlib import pyplot as plt def caijian(img): #裁剪圖像與否根據選擇圖像大小而定,調用了opencv函數 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三向量相同,色調為黑 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函數是合并單通道成多通道 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): h1,s1,v1 = cv2.split(img) rg = rgb.copy() rows,cols = h1.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 = h1[i][j] v = v1[i][j] / 255 s = s1[i][j] / 255 h = h2 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() |
以上代碼是在盡量不調用opencv函數的情況下編寫,其目的是熟悉圖像處理原理和python編程,注釋很少,其中rgb轉hsv原理,hsv轉rgb原理,在csdn中都能找到,灰度圖替換hsv中的v原理其實很簡單,看代碼就能明白,不用再找資料。
總結
以上所述是小編給大家介紹的python+opencv實現圖像融合的原理及代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://blog.csdn.net/Skymelu/article/details/84767689