数字图像处理基础(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)
以下操作都是整个数组对应元素进行操作
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)
#变形也有两种写法
print(v.reshape((1,4)))
print(np.reshape(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)重采样

格式 cv2.resize(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_CUBIC 4x4像素邻域的双三次插值
INTER_LANCZOS4 8x8像素邻域的Lanczos插值

例子

# 将图像“放大”到原来的2倍(使用Bicubic插值方法)
smaller_img= cv2.resize(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 = gray.reshape((-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

发布了18 篇原创文章 · 获赞 1 · 访问量 307
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览