Python基础和Scikit Image
scikit image是用于图像处理的基本模块。使用import skimage导入环境。下面是Scikit image在python中的操作:
1.上传和查看图像
from skimage import io img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") io.imshow(img)
输出如图所示
2.获取图像分辨率
使用名为shape的内置函数获取图像分辨率。
img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") img.shape
输出如下:(511, 419, 3)
可以知道图像分辨率是511×419,并且有三个通道,因为使用了RGB色彩。
3.查看像素值
#getting Pixel Values from skimage import io import pandas as pd img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") df=pd.DataFrame(img.flatten()) filepath="pixel_value1.xlsx" df.to_excel(filepath,index=False)
4.转换色彩空间
假设我们的图像在RGB色彩空间内,也可以转换成其他色彩格式。
- 我们需要使用color类将图像转换成不同的色彩格式,color类在skimage模块中。
- 还必须使用另一个模块pylab。
(1).RGB到HSV和HSV到RGB
#Import libraries from skimage import io from skimage import color from skimage import data from pylab import * #Read image img = io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Convert to HSV img_hsv = color.rgb2hsv(img) #Convert back to RGB img_rgb = color.hsv2rgb(img_hsv) # show both figures figure(0) io.imshow(img_hsv) figure(1) io.imshow(img_rgb)
输出如下:
(2)RGB到XYZ和XYZ到RGB
#Import libraries from skimage import io from skimage import color from skimage import data from pylab import * #Read image img = io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Convert to XYZ img_xyz = color.rgb2xyz(img) #Convert back to RGB img_rgb = color.xyz2rgb(img_xyz) # show both figures figure(0) io.imshow(img_xyz) figure(1) io.imshow(img_rgb)
(3)RGB到YUV和YUV到RGB
#Import libraries from skimage import io from skimage import color from skimage import data from pylab import * #Read image img = io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Convert to XYZ img_yuv = color.rgb2yuv(img) #Convert back to RGB img_rgb = color.yuv2rgb(img_yuv) # show both figures figure(0) io.imshow(img_yuv) figure(1) io.imshow(img_rgb)
……
5. 保存图像
每次分析完图像后,我们可能想保存图像。用skimage.io里的imsave函数。
#Import libraries from skimage import io from skimage import color from skimage import data from pylab import * #Read image img = io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Convert to XYZ img_yuv = color.rgb2yuv(img) #Convert back to RGB img_rgb = color.yuv2rgb(img_yuv) io.imsave("Lena_yuv.jpg",img_yuv)
6.创建基本图形
使用skimage中的绘图类draw进行基本绘图
1.直线
line函数用于在图像上绘制简单的直线。在下列代码中,前两个参数表示第一个点,后两个参数表示第二个点。可以改变支线的像素值以便能够在图像上查看这些点。
from skimage import io from skimage import draw img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") x,y=draw.line(0,0,200,200) img[x,y]=0 io.imshow(img) print(x) print(y)
2.绘制矩形
可以使用polygon函数绘制矩形,也可绘制任意的多边形。我们只需要给定x和y坐标,然后定义宽度和高度即可。
在下面的代码中使用了rectangle函数。它返回我们要修改的形状。
from skimage import io from skimage import draw img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") def rectangle(x,y,w,h): rr,cc=[x,x+w,x+w,x],[y,y,y+h,y+h] return (draw.polygon(rr,cc)) rr,cc = rectangle(10,10,200,200) img[rr,cc]=80 io.imshow(img)
3.绘制圆形
circle函数用于绘制圆形,在下列代码中,前两个参数表示圆形在图像中的位置,后两个参数表示半径。
#Import libraries from skimage import io from skimage import draw #Load image img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Define circle coordinates and radius x,y=draw.circle(200,200,10) #Draw circle img[x,y]=30 #Show image io.imshow(img)
4.绘制贝塞尔曲线
#Import libraries from skimage import io from skimage import draw #Load image img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") #Define Bezier curve coordinates x,y=draw.bezier_curve(0,0,20,20,50,90,100) #Draw Bezier img[x,y]=30 #Show image io.imshow(img)
可以使用bezier_curve 函数绘制贝塞尔曲线。我们需要指定至少三个控制点的位置,然后获取曲线的形状。下列代码中前六个参数定义了3个点,最后一个参数定义了曲线中的张力(tension)。调整参数值会改变曲线的形状。
5.执行伽马校正
使用skimage模块中的exposure类,根据显示设备的属性进行伽马校正。exposure类中包含了名为adjust_gamma的函数,它以图像和期望的伽马值为输入。我们会得到伽马校正后的图像。
from skimage import exposure from skimage import io from pylab import * img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") gamma_corrected1=exposure.adjust_gamma(img,0.5) gamma_corrected2=exposure.adjust_gamma(img,5) figure(0) io.imshow(gamma_corrected1) figure(1) io.imshow(gamma_corrected2)
6.旋转、平移和缩放图像
有时候我们可能会想旋转图像或者修改图像的尺寸。为此,可以使用skimage模块中的transform类。Transform类有两个函数:rotate和resize,其中rotate以旋转角度为参数,而resize以目标尺寸为参数。
from skimage import io from skimage.transform import rotate img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") img_rot=rotate(img,20) io.imshow(img_rot)
from skimage import io from skimage.transform import resize img=io.imread("C:\\Users\\mac\\Pictures\\measure\\Lena.jpg") img_res=resize(img,(100,100)) io.imshow(img_res) io.imsave("ss.jpg",img_res)
7.确定结构相似度
结构相似度是衡量两个图像相似程度的指标。数值接近1表明图像非常相似,数值接近0表明图像比较不相似。
from skimage import io from skimage.measure import compare_ssim as ssim img_original=io.imread('Lena_rgb.jpg') img_modified=io.imread('Lena_yuv.jpg') ssim_original=ssim(img_original,img_original,data_range=img_original.max()-img_original.min(),multichannel=True) ssim_different=ssim(img_original,img_modified,data_range=img_modified.max()-img_modified.min(),multichannel=True) print(ssim_original,ssim_different)
输出结果为:1.0 0.532746174187595
SSIM有四个参数。前两个参数表示图像,第三个参数表示像素值的范围(最大像素值减去最小像素值),第四个参数是multichannel。当multichannel参数取值为True时,表示图像包含不止一个通道,例如RGB;当multichannel参数取值为False时,表示只有一个通道,例如灰度。