純Python綜合圖像處理小工具(1)分通道直方圖


平時工作經常需要做些圖像分析,需要給圖像分通道,計算各個通道的直方圖分布特點,這個事兒photoshop也能做,但是用起來不方便,且需要電腦上安裝有PS軟件,如果用OpenCV 更是需要在visual studio上做很多配置工作。本文充分利用python的便攜性和輕量級特點,力圖實現一個腳本,到處處理的目標。

注:本文使用Python2.7.8和PIL1.1.7,注意版本問題。

<使用方法>

          1.將待處理圖片命名為1.jpg和本文python腳本文件放入同一文件夾;

 

          2.運行python腳本,可以獲得分通道圖片及相應的直方圖。

 


<效果介紹>

原圖:

 

 

分通道顯示:

 

 各通道直方圖

R通道直方圖                                                                                                                                                                                

 

 

G通道直方圖  

 

                                           

B通道直方圖

 

 

 <源碼分析>

本文腳本沒有使用OpenCV,全部操作均使用了python自帶庫函數,實現真正的輕量級。

本文工具默認對jpg格式的圖片進行修改,其他格式直接修改腳本中im1 = Image.open("1.jpg")圖片后綴即可。 

分通道是直接使用的 r,g,b=im1_sp.split()的, 因只對RGB mode的圖像有效,所以im1_sp = im1.convert("RGB")先進行了模式轉換。 

一張RGB彩色圖像經過通道分離,獲得三張單通道灰度圖像,即python中定義的“L” mode的圖像, 然后對每一個灰度圖繪制直方圖。

直方圖繪制是通過 pix = r.load()函數把圖像的像素數據進行存儲,然后在256級區間進行累加統計,最后使用draw.line函數繪制的。 

工具簡單易用,全部代碼提供如下,如有問題,歡迎園友反饋! 

 

<全部源碼>

#  -*- coding: cp936 -*-
#
阿瓦圖像村出品,轉載請注明出處 QQ:576916092
import Image,ImageDraw,ImageFilter,random,sys
im1 = Image.open( " 1.jpg ")
 
# #圖像處理##
 
# 轉換為RGB圖像
im1_sp = im1.convert( " RGB ")              

# 將RGB三個通道分開
r,g,b=im1_sp.split()             
 
# 將RGB分通道圖像上色
imd = Image.new( " L ",im1.size,0)
r_color= Image.merge( " RGB ",(r,imd,imd))
g_color= Image.merge( " RGB ",(imd,g,imd))
b_color= Image.merge( " RGB ",(imd,imd,b))
 
# R通道histogram
width, height = r.size
pix = r.load()
a = [0]*256
for w  in xrange(width):
     for h  in xrange(height):
        p = pix[w,h]
        a[p] = a[p] + 1
s = max(a)
print a,len(a),s      # 長度256,a保存的分別是顏色范圍0-255出現的次數
r_hist = Image.new( ' RGB ',(512,512),(255,255,255))  
draw = ImageDraw.Draw(r_hist)  
 
for k  in range(256):
    # print k,a[k],a[k]*200/s
    a[k] = a[k]*400/s         # 映射范圍0-200
    source = (2*k,511)            # 起點坐標y=255, x=[0,1,2....]
    target = (2*k,511-a[k])     # 終點坐標y=255-a[x],a[x]的最大數值是200,x=[0,1,2....]
    draw.line([source, target], (255,0,0))
 
# G通道histogram
width, height = g.size
pix = g.load()
a = [0]*256
for w  in xrange(width):
     for h  in xrange(height):
        p = pix[w,h]
        a[p] = a[p] + 1
s = max(a)
print a,len(a),s      # 長度256,a保存的分別是顏色范圍0-255出現的次數
g_hist = Image.new( ' RGB ',(512,512),(255,255,255))  
draw = ImageDraw.Draw(g_hist)  

for k  in range(256):
     # print k,a[k],a[k]*200/s
    a[k] = a[k]*400/s         # 映射范圍0-200
    source = (2*k,511)            # 起點坐標y=255, x=[0,1,2....]
    target = (2*k,511-a[k])     # 終點坐標y=255-a[x],a[x]的最大數值是200,x=[0,1,2....]
    draw.line([source, target], (0,255,0))

# B通道histogram
width, height = b.size
pix = b.load()
a = [0]*256
for w  in xrange(width):
     for h  in xrange(height):
        p = pix[w,h]
        a[p] = a[p] + 1
s = max(a)
print a,len(a),s      # 長度256,a保存的分別是顏色范圍0-255出現的次數
b_hist = Image.new( ' RGB ',(512,512),(255,255,255))  
draw = ImageDraw.Draw(b_hist)  

for k  in range(256):
     # print k,a[k],a[k]*200/s
    a[k] = a[k]*400/s         # 映射范圍0-200
    source = (2*k,511)            # 起點坐標y=255, x=[0,1,2....]
    target = (2*k,511-a[k])     # 終點坐標y=255-a[x],a[x]的最大數值是200,x=[0,1,2....]
    draw.line([source, target], (0,0,255))

im1_mer= Image.merge( " RGB ",(r,g,b))

# #圖像保存##

# 單通道圖保存
r.save( " 1r.jpg ")
g.save( " 1g.jpg ")
b.save( " 1b.jpg ")

# 上色圖保存
r_color.save( " 1rr.jpg ")
g_color.save( " 1gg.jpg ")
b_color.save( " 1bb.jpg ")

# 直方圖保存
r_hist.save( " 1r_hist.jpg ")
g_hist.save( " 1g_hist.jpg ")
b_hist.save( " 1b_hist.jpg ")

# #圖像顯示##

# 單通道圖顯示
r.show()
g.show()
b.show()
 
# 上色圖顯示
r_color.show()
g_color.show()
b_color.show()

# 直方圖顯示
r_hist.show()
g_hist.show()
b_hist.show()



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM