编辑推荐: |
这篇文章主要介绍了python数字图像处理之高级形态学处理
, 希望对您的学习有所帮助。
本文来自于csdn,由火龙果软件Alice编辑,推荐。 |
|
一,前期安装:
选择skimage包,里面提供了io模块,用来图片的输入输出
我的Windows由于TensorFlow环境关系,安装了python3.7.1和3.6两个版本,IDLE
spyder同样,因此这里我就都给安装了。
【1】3.7.1的skimage安装
功能键+R,打开窗口,再打开CMD命令行窗口
用pip安装:pip install skimage
系统提示,install scikit-iamge,说明这个是完整的名
pip install scikit-image---安装成功
验证:进入python环境,import skimage
这样,skimage模块就装好了
【2】tf下安装
同样,先进入命令行,不过需要输入activate tf,进入tf环境下
至此,两个python里面都可以导入skimage了。
二,数字图像的读取和显示
代码解释见注释~~
在3.6版本运行中发现,只能对图片进行读取,但是无法显示,应该是windows和这个包不兼容的原因,因此后续的操作全部用python3.7.1处理。
1.彩色图片
from skimage
import io #导入skimage包里面的io模块
imag=io.imread('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
#读入:调用imread函数,参数为图片路径,return为矩阵
io.imshow(imag) #调用imshow函数,参数为读入的数组,return为图像 |
2.灰白图片
from skimage
import io #导入skimage包里面的io模块
imag_grey=io.imread('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg',as_grey=True)
#读入:调用imread函数,参数为图片路径,return为矩阵
io.imshow(imag_grey) #调用imshow函数,参数为读入的数组,return为图像 |
三,变量栏介绍
1.彩色图片
【1】右边的value显示的是色彩值:0代表黑色,255代表白色,最大就是255,0-255一共256个数,是2的8次方
【2】双击size打开的是一个表格
下拉进度条:行可以拖到4200,对应像素的size,列:0 1 2表示RGB三通道,颜色区域的每一个值(253)表示的是像素的颜色
2.灰白图片
【1】size只有两部分(2245,4200),分别是图片的行和列
【2】因为灰色,所以value值也变小,接近零
【3】注意:数据的类型是uint8还是float与size无关,即:对于unit8而言,是图片读入和读出的最终形式,可以是单层,即imag0那样,没有通道,是灰色;也可以是三层,即imag那样,有(行,列,3通道-RGB);对于folat而言,就是行和列。
当进行灰度处理:as_grey=True时,如果之前是uint8(三层彩色)会把图片type转为float,但如果本身是uint8(单层灰色),默认不会转,所以该操作无效。
四,图片像素的剪裁和访问
1.基础知识
图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问。
彩色图片访问方式为:img[i,j,c]
i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始。
灰度图片访问方式为:gray[i,j]
2.操作
【1】对图片进行截取
from skimage import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
image_part=imag[1000:2245,0:2000,:]
#截取的是左下角,彩色
io.imshow(image_part) |
【2】对图片进行单通道显示
from skimage
import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
image_R=imag[:,:,0]
#只显示R通道
io.imshow(image_R) |
【3】将图片的GB(RG/RB)通道全部取零
from skimage
import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
imag[:,:,1]=0
imag[:,:,2]=0
#GB通道的像素点值全部为零
io.imshow(imag) |
~绿色
from skimage
import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
imag[:,:,2]=0
imag[:,:,0]=0
#GB通道的像素点值全部为零
io.imshow(imag) |
可以看到变量栏,R和B通道全部都是0
~蓝色
from skimage
import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
imag[:,:,1]=0
imag[:,:,0]=0
#GB通道的像素点值全部为零
io.imshow(imag) |
【4】查看并修改像素值
~查看
from skimage
import io
imag=io.read('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
pixel=imag[3,4,1]
print(pixel)
#im.show()对应的是显示图片,imag是一个数组,所以显示的是对应的值 |
#im.show()对应的是显示图片,imag是一个数组,所以显示的是对应的值
显示:253
~修改:随机添加500000个椒盐噪声
这里用到了numpy包里的random来生成随机数,randint(0,cols)表示随机生成一个整数,范围在0到cols之间。
用img[x,y,:]=255这句来对像素值进行修改,将原来的三通道像素值,变为255
from skimage
import io
import numpy as np
#导入numpy模块
imag_noise=io.imread('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg')
rows,cols,dims=imag_noise.shape
#赋值
for i in range(500000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
#整个图片区域内,像素点(行列相交的像素点)随机选中500000个,randint表示整数值
imag_noise[x,y,:]=255
#给这几个点附上白色(255),黑色是0
io.imshow(imag_noise) |
显示:
【5】对图像进行旋转
~方法一:调用skimage里面的transform模块
from skimage
import io,transform
image=io.imread('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片3.jpg')
io.imshow(image)
image_2=transform.rotate(image,90)#旋转90°
io.imshow(image_2) |
注意:虽然imshow两次,但是最终我的python只显示了最后show的旋转后的图片,前面show出来的被覆盖了
~自己写代码:
from skimage
import io
import numpy as np
image=io.imread('C:/Users/Ruan Qing/Desktop/python基础--刘老师/20190412/示例图片2.jpg',as_grey=True)
cols,rows=image.shape
im_r=np.zeros((rows,cols))
#初始化一个全部为0的数组
a=rows-1
for i in range(rows):
for j in range(cols):
im_r[i,j]=image[j,a]
a=a-1
io.imshow(im_r) |
注意:这里面,需要设置as_grey=True,输出黑白图片,得到的图片类型为float64
如果不变成黑白,那么read出的图片格式为unit8-二进制,值的范围为0-255,但是创建的numpy数组为float64,范围为0-1,或-1,没有办法装入初始化的numpy数组中,所以程序会报错,如下
正确结果显示:
接着替换图片1.jpg
|