解决:Clipping input data to the valid range for imshow with RGB data
Clipping input data to the valid range for imshow with RGB data
今天在提取彩色圖像RGB通道值合成單通道圖像時(shí),出現(xiàn)問題:
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).先給出原因:
matplotlib.pyplot.imshow()函數(shù)在處理灰度圖像時(shí),自動(dòng)將其值做歸一化處理
而在處理彩色圖像時(shí)則不會(huì),而是將浮點(diǎn)值變換至[0,1],整數(shù)值變換到[0, 255]范圍
上代碼:
def slic_image(image_path, block_number, compactness, sigma):image = cv2.imread(image_path)image_depth = image.shape[2]if image_depth == 3:image_r, image_g, image_b = cv2.split(image)image_r = image_r.astype('float32')image_g = image_g.astype('float32')image_b = image_b.astype('float32')syn_image_g = syn_single_channel_image(sig_channel_image=image_g, channel_name="g")plt.imshow(syn_image_g)plt.show()def syn_single_channel_image(sig_channel_image, channel_name,):image_height = sig_channel_image.shape[0]image_width = sig_channel_image.shape[1]b = np.empty(shape=(image_height, image_width), dtype="float32")g = np.empty(shape=(image_height, image_width), dtype="float32")r = np.empty(shape=(image_height, image_width), dtype="float32")b[:][:] = 0g[:][:] = 0r[:][:] = 0synthesis = [r, g, b]if channel_name == 'r':synthesis = [sig_channel_image, g, b]elif channel_name == 'g':synthesis = [r, sig_channel_image, r]elif channel_name == 'b':synthesis = [r, g, sig_channel_image]synthesis_image = cv2.merge(synthesis)return synthesis_imageslic_image(image_path='test.png', block_number=30, compactness=10, sigma=5)簡(jiǎn)單描述大概就是:將一張圖像的三個(gè)通道信息分別抽取出來,與另外兩個(gè)大小相等的0數(shù)組來合成單色圖像。
這里我將抽取出的每個(gè)通道的信息都轉(zhuǎn)為float32,原目的的為了更好的保留圖像的信息(后來發(fā)現(xiàn)使用cv2.imread( )函數(shù)讀取的圖像,其像素值類型本就為uint8,完全沒有必要這么做)
最后合成的結(jié)果自然是三個(gè)通道的數(shù)據(jù)類型全部是float32,在調(diào)用plt.imshow( )函數(shù)的時(shí)候全被調(diào)整到了[0, 1]范圍內(nèi),最后導(dǎo)致生成了幾乎全是綠色的圖像:
? 原圖與合成圖像的顯示對(duì)比
解決方法:
? 最終我將數(shù)組中的數(shù)據(jù)類型全部定義為uint8,這樣就正常了。
結(jié)果:
今天在提取彩色圖像RGB通道值合成單通道圖像時(shí),出現(xiàn)問題:
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).先給出原因:
matplotlib.pyplot.imshow()函數(shù)在處理灰度圖像時(shí),自動(dòng)將其值做歸一化處理
而在處理彩色圖像時(shí)則不會(huì),而是將浮點(diǎn)值變換至[0,1],整數(shù)值變換到[0, 255]范圍
上代碼:
def slic_image(image_path, block_number, compactness, sigma):image = cv2.imread(image_path)image_depth = image.shape[2]if image_depth == 3:image_r, image_g, image_b = cv2.split(image)image_r = image_r.astype('float32')image_g = image_g.astype('float32')image_b = image_b.astype('float32')syn_image_g = syn_single_channel_image(sig_channel_image=image_g, channel_name="g")plt.imshow(syn_image_g)plt.show()def syn_single_channel_image(sig_channel_image, channel_name,):image_height = sig_channel_image.shape[0]image_width = sig_channel_image.shape[1]b = np.empty(shape=(image_height, image_width), dtype="float32")g = np.empty(shape=(image_height, image_width), dtype="float32")r = np.empty(shape=(image_height, image_width), dtype="float32")b[:][:] = 0g[:][:] = 0r[:][:] = 0synthesis = [r, g, b]if channel_name == 'r':synthesis = [sig_channel_image, g, b]elif channel_name == 'g':synthesis = [r, sig_channel_image, r]elif channel_name == 'b':synthesis = [r, g, sig_channel_image]synthesis_image = cv2.merge(synthesis)return synthesis_imageslic_image(image_path='test.png', block_number=30, compactness=10, sigma=5)簡(jiǎn)單描述大概就是:將一張圖像的三個(gè)通道信息分別抽取出來,與另外兩個(gè)大小相等的0數(shù)組來合成單色圖像。
這里我將抽取出的每個(gè)通道的信息都轉(zhuǎn)為float32,原目的的為了更好的保留圖像的信息(后來發(fā)現(xiàn)使用cv2.imread( )函數(shù)讀取的圖像,其像素值類型本就為uint8,完全沒有必要這么做)
最后合成的結(jié)果自然是三個(gè)通道的數(shù)據(jù)類型全部是float32,在調(diào)用plt.imshow( )函數(shù)的時(shí)候全被調(diào)整到了[0, 1]范圍內(nèi),最后導(dǎo)致生成了幾乎全是綠色的圖像:
? 原圖與合成圖像的顯示對(duì)比
解決方法:
? 最終我將數(shù)組中的數(shù)據(jù)類型全部定義為uint8,這樣就正常了。
結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的解决:Clipping input data to the valid range for imshow with RGB data的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 新概念二册 Lesson 45 A c
- 下一篇: CESIUM例子学习(十一)——3DTi
