4)Python模块:skimage

PIL

skimage全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,正好与matlab一样。

https://blog.csdn.net/u012300744/article/details/80083282

python提供的图像处理包有PIL,Pillow, opencv, scikit-imagePIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。

 

io  读取、保存和显示图片或视频


  

import skimage.io as io   or    from skimage import io

 

imread:

from PIL import Image as img
from skimage import io
#Image和skimage读图片
img_file1 = img.open('./1.png')# (width, height)
img_file2 = io.imread('./1.png')# (height,width, channel)
#img=io.imread('d:/dog.jpg',as_grey=True)#获取灰度图

#得到像素:
print(img_file1.getpixel((500,1000)))  #((w,h)) 返回: (253, 251, 239) tuple
print(img_file2[500][1000])  #[h][w]

NOTE:

imread得到的img,类型是ndarray

所以img有ndarray的所有属性:

print(img.shape)  #显示尺寸 rows,cols,dims=img.shape
rows,cols=img.shape[:2]
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])#图像的像素值

彩色图访问:img[i,j,c] 行列通

彩图单通道访问:R=img[:,:,0单通道全部赋值:img[x,y,:]=255

灰度图访问:gray[i,j]   因为是个numpy array。所以访问用[ ]

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

 

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]) # 倒数第二行

批量赋值:

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

遍历像素值:

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) dst=io.imshow(img) #dst 类型是'matplotlib.image.AxesImage'
io.show() #important!!在窗口上绘制完图片后,返回一个AxesImage对象。要在窗口上显示这个对象,我们可以调用show()函数来进行显示,但进行练习的时候(ipython环境中),一般我们可以省略show()函数,也能自动显示出来。但是显示图像通常用matplotlib:

plt.imshow(img)

plt.show()

io.ImageCollection

from skimage import data_dir,io,transform,color
import numpy as np
def convert_gray(f):
        rgb=io.imread(f) #依次读取rgb图片
        gray=color.rgb2gray(rgb) #将rgb图片转换成灰度图
        dst=transform.resize(gray,(256,256)) #将灰度图片大小转换为256*256
        return dst str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
for i in range(len(coll)):
    io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循环保存图片
图像的形变与缩放
图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全。
1、改变图片尺寸resize
函数格式为:

skimage.transform.resize(image, output_shape)
image: 需要改变尺寸的图片
output_shape: 新的图片尺寸

from skimage import transform,data
import matplotlib.pyplot as plt
img = data.camera()
dst=transform.resize(img, (80, 60))
plt.figure('resize')
plt.subplot(121)
plt.title('before resize')
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title('before resize')
plt.imshow(dst,plt.cm.gray)
plt.show()






data   提供一些测试图片和样本数据

 

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

astronaut     航员图片      coffee     一杯咖啡图片   
lena          lena美女图片   camera   拿相机的人图片   
coins           硬币图片     moon    月亮图片
checkerboard   棋盘图片       horse   马图片   
page   书页图片              chelsea   小猫图片     
hubble_deep_field    星空图片   text   文字图片
clock    时钟图片   immunohistochemistry   结肠图片
查看所在路径:
 
from skimage import data_dir
print(data_dir)



color  颜色空间变换
 

颜色空间有灰度空间、rgb空间、hsv空间和cmyk空间。颜色空间转换以后,图片类型都变成了float

print(img.dtype.name) 查看

img_gray=color.rgb2gray(img) 彩图转灰度图,image_gray 类型是ndarray数组,但是数据是[0,1]间float64,需要变成普通的0-256

skimage.color.rgb2grey(rgb)
skimage.color.rgb2hsv(rgb)
skimage.color.rgb2lab(rgb)
skimage.color.gray2rgb(image)
skimage.color.hsv2rgb(hsv)
skimage.color.lab2rgb(lab)
实际上,上面的所有转换函数,都可以用一个函数来代替
skimage.color.convert_colorspace(arr, fromspace, tospace)
hsv=color.convert_colorspace(img,'RGB','HSV')
skimage.color.label2rgb(arr), 可以根据标签值对图片进行着色。以后的图片分类后着色就可以用这个函数。
gray->label->rgb

from skimage import io,data,color
import numpy as np
img=data.astronaut()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
    for j in range(cols):
        if(gray[i,j]<0.4):
            labels[i,j]=0
        elif(gray[i,j]<0.75):
            labels[i,j]=1
        else:
            labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)
io.show()
 




transform 几何变换或其它变换,如旋转、拉伸和拉东变换等

dst=transform.resize(img, (80, 60))

skimage.transform.rescale(image, scale[, ...])
    scale
参数可以是单个float数,表示缩放的倍数,也可以是一个float型的tuple\list,如[0.2,0.5],表示将行列数分开进行缩放
transform.rotate(image, angle[, ...],resize=False)
    angle
参数是个float类型数,表示旋转的度数;resize用于控制在旋转时,是否改变大小 ,默认为False

以多分辨率来解释图像的一种有效但概念简单的结构就是图像金字塔。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像集合。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。当向金字塔的上层移动时,尺寸和分辨率就降低。
skimage.transform.pyramid_gaussian(image, downscale=2)  高斯金字塔
downscale
控制着金字塔的缩放比例
skimage.transform.pyramid_laplacian(image, downscale=2)  拉普拉斯金字塔

import numpy as np
import matplotlib.pyplot as plt
from skimage import data, transform

image = data.astronaut()  # 载入宇航员图片
rows, cols, dim = image.shape  # 获取图片的行数,列数和通道数
pyramid = tuple(transform.pyramid_gaussian(image, downscale=2))  # 产生高斯金字塔图像#共生成了log(512)=9幅金字塔图像,加上原始图像共10幅,pyramid[0]-pyramid[1]
composite_image = np.ones((rows, cols + int(cols / 2), 3), dtype=np.double)  # 生成背景composite_image[:rows, :cols, :] = pyramid[0] #融合原始图像
i_row = 0
for p in pyramid[1:]:
    n_rows, n_cols = p.shape[:2]
    print(p.shape)
    composite_image[i_row:i_row + n_rows, cols:cols + n_cols] = p  # 循环融合9幅金字塔图像
    i_row += n_rows

plt.imshow(composite_image)
plt.show()

4)Python模块:skimage_第1张图片

 

 


viewer

from skimage import viewer,data
img = data.coins()
viewer = viewer.ImageViewer(img)
viewer.show()

 

data type comnvert

import skimage
img = data.coins()
dst=skimage.img_as_float(img)

img_as_float    Convert to 64-bit floating point.
img_as_ubyte    Convert to 8-bit uint.
img_as_uint     Convert to 16-bit uint.
img_as_int      Convert to 16-bit int.

 

exposure    图片强度调整,如亮度、对比度、直方图均衡等

 

exposure.adjust_gamma(image, gamma=1)

<1 亮度变亮

exposure.adjust_log(image) #对数调整  变亮

exposure.is_low_contrast(image)判断图像对比度是否偏低
newImage=exposure.rescale_intensity(image, in_range='image', out_range='dtype')  增强对比度
 

in_range 表示输入图片的强度范围,默认为'image', 表示用图像的最大/最小像素值作为范围
out_range 表示输出图片的强度范围,默认为'dype', 表示用图像的类型的最大/最小值作为范围
默认情况下,输入图片的[min,max]范围被拉伸到[dtype.min, dtype.max],如果dtype=uint8, 那么dtype.min=0, dtype.max=255

如果想输入图片像素值等比例缩放,用in_range
mat=exposure.rescale_intensity(tmp,in_range=(0,255))
原像素值除以255,如果参数in_range的[min,max]范围要比原始像素值的范围[min,max] 大或者小,那就进行裁剪

如果一个数组里面有负数,现在想调整到正数,就使用out_range参数
exposure.rescale_intensity(image, out_range=(0, 127))

exposure.histogram(image, nbins=256)
numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义。np.histogram(image, bins=2)


返回一个tuplehist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值
nbins的意思是分成几个级别的灰度进行统计。

 

exposure.equalize_hist(img)  直方图均衡化

exposure.equalize_adapthist(img, kernel_size=32, clip_limit=clip_limitnumber, nbins=256)  #kernel_size 可调整

如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。

绘制直方图用 :  img.flatten(),  plt.hist(img)



其他

 

feature 特征检测与提取等

filters  图像增强、边缘检测、排序滤波器、自动阈值等
draw   操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等

morphology  形态学操作,如开闭运算、骨架提取等

measure  图像属性的测量,如相似性或等高线等
segmentation   图像分割
restoration    图像恢复
util    通用函数

 

 

 

你可能感兴趣的:(Python)