python图像处理之采样量化、可视化、图像处理

前言:上次说到图像的采样和量化,承接上次继续学习。

2 图像采样和量化

数字图像有两个重要属性:空间位置(X,Y)以及响应值 I(X,Y)。
模拟图像是连续的信号,数字图像是离散的值;
采样:图像空间坐标的离散化,决定了图像的空间分辨率
量化:图像响应幅值的的离散化,决定了图像的灰度分辨率
采样和量化是模拟图像转换为数字图像的两个重要操作。

2.1图像采样

图像采样是将一副空间上连续分布的模拟图像分割成M*N的网格。

采样的过程:沿垂直方向按照一定的间隔从上到下顺序的沿水平方向直线扫描,取出各水平线上灰度值的一维扫描,然后对一维扫描线信号按一定间隔采样得到离散信号.
python图像处理之采样量化、可视化、图像处理_第1张图片

采样的方式:一般有均匀采样与不均匀采样两类;
(1)、均匀采样根据需要的MN分辨率,将图像均匀的分为MN块,对每一个图像块利用采样函数求得采样结果值,常用的采样函数为求区域平均值。
(2)、不均匀采样是在需要体现细节的位置增加采样频率,在图像变化小的区域,相应减少采样频率。例如在影像图上进行采样,在道路或河流的拐弯处需要增加采样的频率,在直路上减少采样频率,以获取精准的图像。
以下是关于采样的代码,但我感觉输出有问题。

#利用均值方法进行图像的采样
import numpy as np
from skimage import data
from matplotlib import pyplot as plt
image=data.coffee() 
print(image.shape)
print(type(image))
ratio=100   #此处可以改变图像的分辨率
image1=np.zeros((int(image.shape[0]/ratio),
                 int(image.shape[1]/ratio),
                 image.shape[2]),dtype='float32')

for i in range(image1.shape[0]):
    for j in range(image1.shape[1]):
        for k in range(image1.shape[2]):
            delta=image[i*ratio:(i+1)*ratio,j*ratio:(j+1)*ratio,k]
            image1[i,j,k]=np.mean(delta)
plt.imshow(image1)
plt.show()
plt.imshow(image)
plt.show()

输出结果:
python图像处理之采样量化、可视化、图像处理_第2张图片

按理来说,预期结果是下面,但是我没找到问题在哪。。。
python图像处理之采样量化、可视化、图像处理_第3张图片

2.2图像量化

经过采样的模拟图像,在空间上实现了离散化,但是采样所得的像素值(灰度值)依然是连续量。量化即是将采样后的灰度值由连续量转化成离散量.

from skimage import data
from matplotlib import pyplot as plt
image=data.coffee()
print("原始图片:")
plt.imshow(image)
plt.show()
ratio=128  # 设置量化比率
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        for k in range(image.shape[2]):
            image[i][j][k]=int(image[i][j][k]/ratio)*ratio
print("量化后图片:")
plt.imshow(image)
plt.show()

输出结果
python图像处理之采样量化、可视化、图像处理_第4张图片
此处,图片采样和量化的代码在循环时语法一样,只是采样需要先声明一个空的数组来存放新的数组;量化直接在原始图片上进行。

3 图像的表示和可视化

3.1图像的表示

与图像的表示相关的指标是图像分辨率。
图像分辨率:值一幅图像的像素密度,对同样大小的图,像素越多,图像分辨率高。图像分辨率包括空间分辨率和灰度级(相应幅度)分辨率。

空间分辨率:图像中可分辨的最小空间细节,取样值是决定空间分辨率的主要参数。

灰度级分辨率:指灰度级别中可分辨的最小变化,灰度级数一般为2的整数次幂。

通常把大小为MN、灰度为L级的数字图像称为空间分辨率为MN 像素,灰度级分辨率为L级的数字图像。
按照图像矩阵包含元素的不同,大致分为二值图像、灰度图像和彩色图像。

二值图像::称为单色图像或1位图像,颜色深度为1表示每个像素点仅占1位,一般用0表示黑,1表示白。

灰度图像:包含灰度级(亮度)的图像,每个像素由8位组成,其值的范围为0~255,表示256种不同的灰度级。

彩色图像:彩色图像与灰度图像类似,每个像素也会呈现0~255共256个灰度级。与灰度图像不同的是,彩色图像每个像素由3个8位灰度值组成,分别对应红、绿、蓝3个颜色通道

图像文件除了图像数据本身外,还有对图像的描述信息,一般分为矢量和栅格保存。
矢量图像:图像用一系列线段或线段的组合体表示,工程绘图应用多。

栅格图像:又称为位图图像或像素图像,使用矩阵或离散的像素点表示图像,栅格图像进行放大后会出现方块效应,常见的图像格式BMP是栅格图像的典型代表。

3.2图像的格式

(1)、BMP图像格式
也称位图,由三部分组成,
位图头文件(位图文件类型,大小,数据其实位置等,用于位图文件的解析),
位图信息部分(图像的水平宽度,垂直宽度等,用于图像的显示阶段)
位图数据部分(从上到下,从左到右记录像素)。
(2)、JPEG图像格式
主要针对静止灰度图像或彩色图像的压缩,属于有损压缩编码方式。
(3)、GIF图像格式
是另外一种压缩图像标准,其主要目的是为了方便网络传输。GIF格式图像中的像素用8位表示,所以最多只能存储256色。

3.3图像的基本属性

(1)、图像像素数量
图像像素数量是指在位图图像的水平和垂直方向上包含的像素数量。
(2)、图像分辨率
图像分辨率是指图像在单位打印长度上分布的像素的数量
(3)、图像大小
图像大小决定了存储图像文件所需的存储空间,一般以字节(B)进行衡量
计算公式为:
字节数=(位图高×位图宽×图像深度)/ 8
(4)、图像颜色
图像颜色是指数字图像中具有的最多数量的可能颜色种类,通过改变红、绿、蓝三原色的比例,可以非常容易地混合成任意一种颜色。
(5)、图像深度
图像深度又称为图像的位深,是指图像中每个像素点所占的位数。
(6)、图像色调
图像色调指各种图像颜色对应原色的明暗程度(如RGB格式的数字图像的原色包括红、绿、蓝3种)
(7)、图像饱和度
图像饱和度表明了图像中颜色的纯度。自然景物照片的饱和度取决于物体反射或投射的特性。在数字图像处理中一般用纯色中混入白光的比例衡量饱和度,纯色中混入的白光越多,饱和度越低,反之饱和度越高。
(8)、图像亮度
图像亮度是指数字图像中包含色彩的明暗程度,是人眼对物体本身明暗程度的感觉,取值范围一般为0%~100%
(9)、图像对比度
图像对比度指的是图像中不同颜色的对比或者明暗程度的对比。
(10)、图像层次
在计算机设计系统中,为更加便捷有效地处理图像素材,通常将它们置于不同的层中,而图像可看作由若干层图像叠加而成。

3.4图像可视化模块

python中可视化模块很多,image模块,OpenCV模块等,今天主要说一个Skimage模块.包括读取图像,索引操作,图片显示等.
图像读取:通过IO模块对磁盘中的图像文件进行读取,读取后放入一个numpy格式的数组内。
索引操作:就是前面基础中的数组的索引(现在知道基础理论的重要了吧,嘿嘿嘿)。
图像展示:主要是matplotlib包两个语句,plt.imshow(图像名) plt.show()

from skimage import data   # skimage包
from skimage import io    # 导入读取模块
from matplotlib import pyplot as plt  #导入绘图模块
image=io.imread('E:/test/test.jpg')   #io读入数据
print(image.shape)   #读入的图片的大小为130*208;包含红绿蓝三个颜色通道
plt.imshow(image)   #可视化数据
plt.show()


#索引操作:单个元素索引和多个元素索引;
image1=image[20:80,30:100,:]    #输出图像的地20到80行;30到100列
plt.imshow(image1)
plt.show()

4 像素间关系

(1)邻域关系
描述相邻像素之间的相邻关系,也称为边邻域。包括4邻域、8邻域、D邻域等类型。其中像素位置(x,y)的4邻域是(x-1,y)、(x+1,y)、(x,y-1)、(x,y+1),分别对应像素位置(x,y)的上、下、左、右4个像素。用符号N4(x,y)表示位置(x,y)的D邻域。
像素的D邻域又可以称为像素的对角邻域。像素位置(x,y)的D邻域为(x-1,y-1)、(x-1,y+1)、(x+1,y-1)、(x+1,y+1)。用符号ND(x,y)表示位置(x,y)的D邻域。
python图像处理之采样量化、可视化、图像处理_第5张图片

(2)连通性
描述区域和边界的重要概念。两个像素连通的必要条件是:两个像素的位置满足相邻关系且两个像素的灰度值满足特定的相似性准则。分为4连通,8连通和m连通。
如果像素q在像素p的4邻域内,则像素p和像素q是4连通的。

(3)像素之间的距离
对于像素p、q和z,坐标分别为(x,y)、(s,t)和(u,v),如果函数D满足距离三要素,即①非负性,D(p,q)≥0,当且仅当p=q时,D(p,q)=0;②对称性,D(p,q)=D(q,p);③三角不等式,D(p,z)≤D(p,q)+D(q,p);则称函数D为有效距离函数或度量

5 简单图像处理

按处理对象可以将数字图像处理分为:黑白图像处理、灰度图像处理、彩色图像处理。
按处理方法可以将数字图像处理分为:空间域处理与频域处理。
按处理策略可以将数字图像处理分为:全局处理与局部处理。

5.1图像基本属性的操作

图像基本属性包括亮度、对比度、颜色通道等。
(1)亮度操作
一般数字图像的像素亮度为0~255,可以通过对像素构成矩阵的灰度值进行操作,达到调整图像亮度的目的。
(2)对比度操作
对比度指的是图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值。设原像素灰度值为f(i,j),转换后的像素灰度为g(i,j),常用的线性变化为g(i,j)=a f(i,j)+b ,系数a影响图像的对比度,系数b影响图像的额亮度。
α=1时是原图;
α>1时对比度增强,图像看起来更加清晰
α<1时对比度减弱,图像看起来变暗
β影响图像的亮度,随着增加β(β>0)和减小β(β>0),图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度。

#颜色通道操作
from skimage import data,io
from matplotlib import pyplot as plt
image=data.coffee()

image_r=image[:,:,0]  #拆分红绿蓝颜色通道
image_g=image[:,:,1]
image_b=image[:,:,2]

plt.subplot(2,2,1)
io.imshow(image)
plt.subplot(2,2,2)
io.imshow(image_r)
plt.subplot(2,2,3)
io.imshow(image_g)
plt.subplot(2,2,4)
io.imshow(image_b)
plt.show()

输出结果:
python图像处理之采样量化、可视化、图像处理_第6张图片

#互换三个颜色通道
temp=image_r    #互换红蓝通道
image_r=image_b
imge_b=temp

image[:,:,0]=image_r
image[:,:,2]=image_b

plt.imshow(image)
plt.show()

输出结果:
python图像处理之采样量化、可视化、图像处理_第7张图片

5.2图像的简单运算

(1)、算数运算和逻辑运算
典型的运算包括图像的加法、图像的减法。算术运算和逻辑运算中每次只涉及一个空间像素的位置,即生成的新的图像可以覆盖旧图像。

#算数运算和逻辑运算
from matplotlib.font_manager import FontProperties
font_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=12)
from skimage import data
from matplotlib import pyplot as plt
moon=data.moon()
camera=data.camera()
image_minus=moon-camera
image_plus=moon+camera
plt.set_cmap(cmap='gray')

plt.subplot(2,2,1)
plt.title('月亮图像',fontproperties=font_set)
plt.imshow(moon)

plt.subplot(2,2,2)
plt.title('摄影师图像',fontproperties=font_set)
plt.imshow(camera)

plt.subplot(2,2,3)
plt.title('月亮加摄影师图像',fontproperties=font_set)
plt.imshow(image_plus)

plt.subplot(2,2,4)
plt.title('月亮减摄影师图像',fontproperties=font_set)
plt.imshow(image_minus)

plt.show()

输出结果:
python图像处理之采样量化、可视化、图像处理_第8张图片
(2)、点运算
点运算只涉及一幅原图像(称为输入图像),运算对象是输入图像像素的灰度值,即输出图像每个像素的灰度值仅取决于输入图像中对应像素的灰度值。点运算也被称为灰度变换。
点运算又可以分为线性点运算和非线性点运算
线性点运算的原值和目标值通过线性方程完成转换,典型的如对比度灰度调整、图像反色都属于线性点运算。
非线性点运算对应非线性映射函数,典型的映射包括平方函数、对数函数、截取(窗口函数)、阈值函数、多值量化函数等。灰度幂次变换、灰度对数变换、阈值化处理、直方图均衡化是较常见的非线性点运算方法。

5.3图像卷积操作

图像卷积操作是图像空间域滤波的基础运算,也是当前许多深度特征提取算法的基础。
卷积操作就是循环将图像和卷积核逐个元素相乘再求和,结果得到卷积后图像的过程。

#图像卷积操作
def matrix_conv(arr, kernel):
    n=len(kernel)
    ans=0
    for i in range(n):
        for j in range(n):
            ans+=arr[i,j]*float(kernel[i,j])
    return ans
def cov2d(img,kernel):
    n=len(kernel)
    img1=np.zeros((img.shape[0]+2*(n-1),img.shape[1]+2*(n-1)))
    img1[(n-1):(n+img.shape[0]-1),(n-1):(n+img.shape[1]-1)]=img
    img2=np.zero((img1.shape[0]-n+1,img1.shape[1]-n+1))
    for i in range(img1.shape[0]-n+1):
        for j in range(img1.shape[1]-n+1):
            temp=img[i:i+n,j:j+n]
            img2[i,j]=matrix_conv(temp,kernel)
    new_img=img2[(n-1):(n+img.shape[0]-1),(n-1):(n+img.shape[1]-1)]
    return new_img

卷积的内涵和应用不是很清楚后续需要继续研究,后面会做一个思维导图来总结,图像处理的基础。

钟楼送给大家!后面几天要赶论文,可能这边学习会推迟几天。加油,每一个努力的你!
python图像处理之采样量化、可视化、图像处理_第9张图片

你可能感兴趣的:(python学习笔记,python,图像处理)