设为首页 收藏本站
查看: 984|回复: 0

[经验分享] 纯Python综合图像处理小工具(1)分通道直方图

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 12:04:14 | 显示全部楼层 |阅读模式
  平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visual studio上做很多配置工作。本文充分利用python的便携性和轻量级特点,力图实现一个脚本,到处处理的目标。
  注:本文使用Python2.7.8和PIL1.1.7,注意版本问题。
<使用方法>
            1.将待处理图片命名为1.jpg和本文python脚本文件放入同一文件夹;
DSC0000.png
  
            2.运行python脚本,可以获得分通道图片及相应的直方图。
DSC0001.png
  
  

<效果介绍>
  原图:
DSC0002.jpg
  
  分通道显示:
DSC0003.jpg
  各通道直方图
  R通道直方图                                                                                                                                                                                
DSC0004.jpg
  
  G通道直方图  
DSC0005.jpg
  
  B通道直方图
DSC0006.jpg
  
  <源码分析>
  本文脚本没有使用OpenCV,全部操作均使用了python自带库函数,实现真正的轻量级。
  本文工具默认对jpg格式的图片进行修改,其他格式直接修改脚本中im1 = Image.open("1.jpg")图片后缀即可。
  分通道是直接使用的 r,g,b=im1_sp.split()的, 因只对RGB mode的图像有效,所以im1_sp = im1.convert("RGB")先进行了模式转换。
  一张RGB彩色图像经过通道分离,获得三张单通道灰度图像,即python中定义的&#8220;L&#8221; 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()  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144897-1-1.html 上篇帖子: Python常见编程规范总结 下篇帖子: 第三章 python基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表