数字图像处理基础(python
数字图像处理基础(python
1.numpy库⽤法
1)创建、shape、dtype和astype
import numpy as np #类似#include
创建长度为3的数组
a = np.array([1, 2, 3])
shape获得形状
print(a.shape)# "(3,)"
print(a[0], a[1], a[2])# "1 2 3"
a[0]= 5
整个数组打印
print(a)# "[5, 2, 3]"
b = np.array([[1,2,3],[4,5,6]])#⼆位数组
print(b.shape)# "(2, 3)"
可以使⽤[,]格式访问数组元素
print(b[0][0], b[0,1])# "1 2"
x = np.array([1, 2])
使⽤type访问数据类型,⾃动数据类型int64;有⼩数的话是float64
print(x.dtype)#"int64"
使⽤强制数据类型
x = np.array([1, 2], dtype=np.int32)
print(x.dtype)# "int32"
arr = x.astype(np.float64)#强制数据类型转化
2)浅拷贝和深拷贝
a = np.array([4,67])
b = a#相当于引⽤
d = a.copy()#深拷贝函数
3)加减乘除、求和和均值
x = np.array([1.2,3.4,5.6], dtype = np.float64)
y = np.array([6.7,8.9,0.2], dtype = np.float64)
以下操作都是整个数组对应元素进⾏操作
python获取数组长度x + y
x - y
x * y
x / y
np.sum(x)#整体求和
#1表⽰横轴,⽅向从左到右;0表⽰纵轴,⽅向从上到下。当axis = 1时,数组的变化为横向,列增加或者减少。当axis = 0时,数组的变化为纵向,⾏增加或减少。
np.sum(x, axis = 0)
mean是求均值,⽤法同x
4)矩阵乘法、幂运算和变形
v= np.array([[1, 2],
[3, 4]])
w = np.array([[ 9, 10],
[11, 12]])
#乘法有两种写法
print(v.dot(w))
print(np.dot(v,w))
#幂运算
u = np.power(v, 0.5)
print(v.shape)#(2,2)
#变形也有两种写法
shape((1,4)))
shape(x,(1,4)))
2.opencv
1)read、write
import cv2
import numpy as np
img= cv2.imread('./example.jpg')# 函数,字符串
#imread格式
imread('路径+扩展名',标记)
常⽤标记有IMREAD_UNCHANGED 按原样返回加载的图像
IMREAD_GRAYSCALE 按灰度模式返回加载的图像
IMREAD_COLOR    BGR三通道模式
#读进来其实是个矩阵,长宽通道数共三维
print(img.shape)# ⾯向对象:属性
print(img.dtype)
b = img[:,:,0]# 注意这个python的切⽚操作
cv2.imwrite('blue.png', b)
#imwrite格式
imread('图像名+扩展名',图像,标记)
# 控制质量/码率
cv2.imwrite('result.jpg', img, params=[cv2.IMWRITE_JPEG_QUALITY, 50])
数字越⼤质量越好
norm_img= img.astype(np.float64) / 255
light_norm_img= np.power(norm_img, 0.5)
light_img= light_norm_img* 255.
cv2.imwrite('light.png', light_img)
最终得到了⼀张很亮的照⽚
2)⾊彩空间变换
格式 cv2.cvtColor(src, code) → dst
HSV: Hue, Saturation, Value
BGR↔Gray的转换,cv2.COLOR_BGR2GRAY
BGR↔HSV的转换,cv2.COLOR_BGR2HSV
hsv_img= cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
3)重采样
格式 size(src,dsize,dst=None,fx=None,fy=None,interpolation=None) scr:原图
dsize:输出图像尺⼨
fx:沿⽔平轴的⽐例因⼦
fy:沿垂直轴的⽐例因⼦
interpolation:插值⽅法
常⽤插值⽅法:
interpolation 选
插值⽅法INTER_NEAREST最近邻插值
INTER_LINEAR双线性插值(默认设置)
INTER_AREA 使⽤像素区域关系进⾏重采样。 它可能是图像抽取的⾸选⽅法,因为它会产⽣⽆云纹理的结果。 但是当图像缩放时,它类似于
INTER_NEAREST⽅法。
INTER_CUBIC4x4像素邻域的双三次插值
INTER_LANCZOS48x8像素邻域的Lanczos插值
例⼦
# 将图像“放⼤”到原来的2倍(使⽤Bicubic插值⽅法)
smaller_img= size(img, (img.shape[1]*2, img.shape[0]*2), interpolation=cv2.INTER_CUBIC)
3.matplotlib
获取图像灰度直⽅图
#matplotlib ⽤于数据可视化
import matplotlib.pyplot as plt
import cv2
import numpy as np
img= cv2.imread('image.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 把矩阵转换成⼀维向量
flat_img = shape((-1))
#也可以⽤numpy包⾥⾯的flatten()
flat_img = gray.flatten()
# hist -> histogram 直⽅图,也就是按值统计像素
plt.hist(flat_img, 256, (0,256))
# 把直⽅图存到这个⽂件⾥,字符串可以直接相加
plt.savefig('hist_'+ 'image.jpeg')
调⽤⽅式:
n, bins, patches = plt.hist(arr, bins = 10, normed = 0, facecolor = ‘black’, edgecolor = ‘black’, alpha = 1,histtype =‘bar’)
hist的参数常⽤有六个,只有第⼀个是必须的,后⾯可选
arr: 需要计算直⽅图的⼀维数组
bins: 直⽅图的柱数,可选项,默认为10。绘制0~255的直⽅图就需要256个bin
normed: 是否将得到的直⽅图向量归⼀化。默认为0。归⼀化可以提升清晰度
facecolor: 直⽅图颜⾊
edgecolor: 直⽅图边框颜⾊
alpha: 透明度
histtype: 直⽅图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值 :
n: 直⽅图向量,是否归⼀化由参数normed设定bins: 返回各个bin的区间范围
patches: 返回每个bin⾥⾯包含的数据,是⼀个list

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。