您现在的位置是:网站首页> 编程资料编程资料

python skimage图像处理_python_

2023-05-26 493人已围观

简介 python skimage图像处理_python_

引言

基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。
PIL和Pillow只提供最基础的数字图像处理,功能有限;

opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,正好与matlab一样,因此,我们最终选择scikit-image进行数字图像处理。

scikit-image进行数字图像处理

Image读出来的是PIL的类型,而skimage.io读出来的数据是numpy格式的

import Image as img import os from matplotlib import pyplot as plot from skimage import io,transform #Image和skimage读图片 img_file1 = img.open('./CXR_png/MCUCXR_0042_0.png') img_file2 = io.imread('./CXR_png/MCUCXR_0042_0.png') 

输出可以看出Img读图片的大小是图片的(width, height);而skimage的是(height,width, channel), [这也是为什么caffe在单独测试时要要在代码中设置:transformer.set_transpose('data',(2,0,1)),因为caffe可以处理的图片的数据格式是(channel,height,width),所以要转换数据]

#读图片后数据的大小: print "the picture's size: ", img_file1.size print "the picture's shape: ", img_file2.shape 
the picture's size: (4892, 4020) the picture's shape: (4020, 4892) 
#得到像素: print(img_file1.getpixel((500,1000)), img_file2[500][1000]) print(img_file1.getpixel((500,1000)), img_file2[1000][500]) print(img_file1.getpixel((1000,500)), img_file2[500][1000]) 

(0, 139)
(0, 0)
(139, 139)

Img读出来的图片获得某点像素用getpixel((w,h))可以直接返回这个点三个通道的像素值
skimage读出来的图片可以直接img_file2[0][0]获得,但是一定记住它的格式,并不是你想的(channel,height,width)

图片信息

如果我们想知道一些skimage图片信息

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()) #像素平均值 print(img[0][0])#图像的像素值 

PIL image 查看图片信息,可用如下的方法

print type(img) print img.size #图片的尺寸 print img.mode #图片的模式 print img.format #图片的格式 print(img.getpixel((0,0)))#得到像素: #img读出来的图片获得某点像素用getpixel((w,h))可以直接返回这个点三个通道的像素值 
# 获取图像的灰度值范围 width = img.size[0] height = img.size[1] # 输出图片的像素值 count = 0 for i in range(0, width): for j in range(0, height): if img.getpixel((i, j))>=0 and img.getpixel((i, j))<=255: count +=1 print count print(height*width) 

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

skimage包的子模块

skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。它是由python语言编写的,由scipy 社区开发和维护。skimage包由许多的子模块组成,各个子模块提供不同的功能。主要子模块列表如下:

子模块名称                 主要实现功能
io                            读取、保存和显示图片或视频
data                       提供一些测试图片和样本数据
color                           颜色空间变换
filters             图像增强、边缘检测、排序滤波器、自动阈值等
draw               操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等
transform          几何变换或其它变换,如旋转、拉伸和拉东变换等
morphology          形态学操作,如开闭运算、骨架提取等
exposure              图片强度调整,如亮度调整、直方图均衡等
feature                        特征检测与提取等
measure                  图像属性的测量,如相似性或等高线等
segmentation                          图像分割
restoration                           图像恢复
util                                  通用函数

从外部读取图片并显示

读取单张彩色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) 

保存图片

使用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图片并保存。

图像像素的访问与裁剪

图片读入程序中后,是以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) 

例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()函数

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

将彩色三通道图片转换成灰度图,最后变成unit8, float转换为unit8是有信息损失的。

img_path = 'data/dpclassifier/newtrain/test/1_0.png' import Image as img import os from matplotlib import pyplot as plot from skimage import io,transform, img_as_ubyte img_file1 = img.open(img_path) img_file1.show() img_file2 = io.imread(img_path) io.imshow(img_file2) print(type(img_file1),img_file1.mode, type(img_file2),img_file2.shape, img_file2.dtype,img_file2.max(),img_file2.min(),img_file2.mean()) img_file22=skimage.color.rgb2gray(img_file2) print(type(img_file22),img_file22.shape,img_file22.dtype,img_file22.max(),img_file22.min(),img_file22.mean() ) dst=img_as_ubyte(img_fi
                
                

-六神源码网