python rgb2gray_Python--图像处理(2)

skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用。

引入skimage模块可用:

一、从外部读取图片并显示

读取单张彩色rgb图片,使用skimage.io.imread(fname)函数,带一个参数,表示需要读取的文件路径。显示图片使用skimage.io.imshow(arr)函数,带一个参数,表示需要显示的arr数组(读取的图片以numpy数组形式计算)。

from skimage import io

img=io.imread('d:/dog.jpg')

io.imshow(img)

读取单张灰度图片,使用skimage.io.imread(fname,as_grey=True)函数,第一个参数为图片路径,第二个参数为as_grey, bool型值,默认为False

from skimage import io

img=io.imread('d:/dog.jpg',as_grey=True)

io.imshow(img)

二、程序自带图片

skimage程序自带了一些示例图片,如果我们不想从外部读取图片,就可以直接使用这些示例图片:

astronaut

宇航员图片

coffee

一杯咖啡图片

lena

lena美女图片

camera

拿相机的人图片

coins

硬币图片

moon

月亮图片

checkerboard

棋盘图片

horse

马图片

page

书页图片

chelsea

小猫图片

hubble_deep_field

星空图片

text

文字图片

clock

时钟图片

immunohistochemistry

结肠图片

显示这些图片可用如下代码,不带任何参数

from skimage import io,data

img=data.lena()

io.imshow(img)

图片名对应的就是函数名,如camera图片对应的函数名为camera(). 这些示例图片存放在skimage的安装目录下面,路径名称为data_dir,我们可以将这个路径打印出来看看:

from skimage import data_dir

print(data_dir)

显示为: D:\Anaconda3\lib\site-packages\skimage\data

也就是说,下面两行读取图片的代码效果是一样的:

from skimage import data_dir,data,io

img1=data.lena() #读取lean图片

img2=io.imread(data_dir+'/lena.png') #读取lena图片

三、保存图片

使用io模块的imsave(fname,arr)函数来实现。第一个参数表示保存的路径和名称,第二个参数表示需要保存的数组变量。

from skimage import io,data

img=data.chelsea()

io.imshow(img)

io.imsave('d:/cat.jpg',img)

保存图片的同时也起到了转换格式的作用。如果读取时图片格式为jpg图片,保存为png格式,则将图片从jpg图片转换为png图片并保存。

四、图片信息

如果我们想知道一些图片信息,可以在spyder编辑器的右上角显示:

也可以直接以程序方式打印输出

from skimage import io,data

img=data.chelsea()

io.imshow(img)

print(type(img)) #显示类型

print(img.shape) #显示尺寸

print(img.shape[0]) #图片宽度

print(img.shape[1]) #图片高度

print(img.shape[2]) #图片通道数

print(img.size) #显示总像素个数

print(img.max()) #最大像素值

print(img.min()) #最小像素值

print(img.mean()) #像素平均值

测试:

#-*- coding: utf-8 -*-

"""Created on Sun Nov 13 16:35:04 2016

@author: ranjiewen"""

#python数字图像处理(2):图像的读取、显示与保存

from skimage importio,datafrom skimage importdata_dir

img=io.imread('F:/BMP/lena.bmp',as_grey=False)#skimage程序自带一些示例图片

img1=data.astronaut();printdata_dir

img2=io.imread(data_dir+'/camera.png')

io.imshow(img1)#io.imshow(img2)

io.imsave('f:/came.jpg',img1)printtype(img1)print img1.shape

图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问。

彩色图片访问方式为:

img[i,j,c]

i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始。

灰度图片访问方式为:

gray[i,j]

例1:输出小猫图片的G通道中的第20行30列的像素值

from skimage import io,data

img=data.chelsea()

pixel=img[20,30,1]

print(pixel)

输出为129

例2:显示红色单通道图片

from skimage import io,data

img=data.chelsea()

R=img[:,:,0]

io.imshow(R)

除了对像素进行读取,也可以修改像素值。

例3:对小猫图片随机添加椒盐噪声

from skimage import io,data

import numpy as np

img=data.chelsea()

#随机生成5000个椒盐

rows,cols,dims=img.shape

for i in range(5000):

x=np.random.randint(0,rows)

y=np.random.randint(0,cols)

img[x,y,:]=255

io.imshow(img)

这里用到了numpy包里的random来生成随机数,randint(0,cols)表示随机生成一个整数,范围在0到cols之间。

用img[x,y,:]=255这句来对像素值进行修改,将原来的三通道像素值,变为255

通过对数组的裁剪,就可以实现对图片的裁剪。

例4:对小猫图片进行裁剪

from skimage import io,data

img=data.chelsea()

roi=img[80:180,100:200,:]

io.imshow(roi)

对多个像素点进行操作,使用数组切片方式访问。切片方式返回的是以指定间隔下标访问 该数组的像素值。下面是有关灰度图像的一些例子:

img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行

img[:,i] = 100 # 将第 i 列的所有数值设为 100

img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和

img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)

img[i].mean() # 第 i 行所有数值的平均值

img[:,-1] # 最后一列

img[-2,:] (or im[-2]) # 倒数第二行

最后我们再看两个对像素值进行访问和改变的例子:

例5:将lena图片进行二值化,像素值大于128的变为1,否则变为0

from skimage import io,data,color

img=data.lena()

img_gray=color.rgb2gray(img)

rows,cols=img_gray.shape

for i in range(rows):

for j in range(cols):

if (img_gray[i,j]<=0.5):

img_gray[i,j]=0

else:

img_gray[i,j]=1

io.imshow(img_gray)

这个例子,使用了color模块的rgb2gray()函数,将彩色三通道图片转换成灰度图。转换结果为float64类型的数组,范围为[0,1]之间。

例6:

from skimage import io,data

img=data.chelsea()

reddish = img[:, :, 0] >170

img[reddish] = [0, 255, 0]

io.imshow(img)

这个例子先对R通道的所有像素值进行判断,如果大于170,则将这个地方的像素值变为[0,255,0], 即G通道值为255,R和B通道值为0。

##python数字图像处理:图像像素的访问与裁剪#from skimage import io,data#img=data.chelsea()#pixel=img[20,30,2]##print pixel##R=img[:,:,0]##io.imshow(R)#import numpy as np#rows,cols,dims=img.shape#for i in range(5000):#x=np.random.randint(0,rows)#y=np.random.randint(0,cols)#img[x,y,:]=255##io.imshow(img)#

#roi=img[80:180,100:200,:]#io.imshow(roi)

#将lena图片进行二值化,像素值大于128的变为1,否则变为0

from skimage importio,data,color

img=data.astronaut()

img_gray=color.rgb2gray(img)

rows,cols=img_gray.shapefor i inrange(rows):for j inrange(cols):if img_gray[i,j]<=0.5:

img_gray[i,j]=0else:

img_gray[i,j]=1

#io.imshow(img_gray)

img1=data.chelsea()

reddish=img1[:,:,0]>170img1[reddish]=[0,255,0]

io.imshow(img1)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值