import numpy as np
import matplotlib
import cv2
1、dtype = data type
常用的:float / uint8 / float32
2、shape (几 X 几 的矩阵)
3、ndim = n dimension
1、np.array()来创立
x = np.array([1,3,5])
x
2、unit8来指定类型
y = np.uint8([1,1,1])
y
3、查看x转换为float型的结果
np.float(x)
4、np.arange()
np.arange(10)
np.arange(2,10,1.5)
5、np.linspace()
np.linspace(0,10,11)
np.linspace(0,2*np.pi,100)
6、全零矩阵:
np.zeros((2,4),dtype = np.int)
查看类型:
7、全1矩阵:
np.ones((3,3),dtype = np.float32)
8、单位矩阵:
np.eye(3)
np.identity(4)
9、创建一个随机数字/数组:
np.random.randint(0,256,(10,10),dtype=np.uint8)
1、.reshape() --- 重塑
2、.flatten() --- 拉平
3、.ravel() --- 拍扁
4、.T --- 转置
5、.transpose() --- 转置
6、np.hstack([A,B]) --- 水平堆叠在一起
7、np.vstack([A,B]) --- 垂直堆叠在一起
1、最大值:.max()
2、最小值:.min()
3、平均值:.mean()
或者是:
4、每行最大值:
5、每列最大值:
1、基本运算与线性代数一致;
2、对应元素平方:np.power(B,2)
3、每个元素log
4、相乘:
* :会先自动把x变为[1,3,5],[1,3,5],[1,3,5],再和A相乘
@ :会把x当为列向量,再和A相乘
@ = A.dot(x)
1、取第0行:
2、取第一列:
3、区域切割:
4、取某个元素:
5、某元素赋值:
6、某行赋值:
1、首先导入库:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
2、读、写图片:
3、外界弹出显示图片:
4、内部显示图片(但是颜色不对):
5、内部显示图片(颜色正确):
6、外界显示灰色图片:
7、内部显示灰色图片(默认是热力图形式,而不是灰色):
8、内部显示灰色图片(修改为灰色图):
9、彩色图片是3维的,灰色图片是2维的,因此定义函数,方便后续打印图片:
def show(img):
if img.ndim == 2:
plt.imshow(img,cmap='gray')
else:
plt.imshow(cv.cvtColor(img,cv.COLOR_BGR2RGB))
plt.show() ##正常显示图片函数
使用如下:
简单说明:
真彩色是每一位都是0-255 ,表示红/绿/蓝的程度(24位);
假彩色与灰度图类似,只不过是用256种取值都是彩色(8位);
图像处理的运算,是循环运算:比如1-2 =255
上图为:2 x 4 的分辨率
上面是红色通道;中间是绿色通道;下面是蓝色通道;
左上角的点,实际上是:(255,127,127) ,彩色图可以拆分为三个通道(R、G、B),每一个通道都相当于是一个灰度图。
有的时候,我们想把一个彩色图转换为一个灰度图,只需要取其中 一个通道即可;或者是如上式那样进行一个加权。上式的权值是根据人眼来调的,取1,0,0也ok。
首先导包:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
定义函数:
def show(img):
if img.ndim == 2:
plt.imshow(img,cmap='gray')
else:
plt.imshow(cv.cvtColor(img,cv.COLOR_BGR2RGB))
plt.show()
灰度图如下(但是这个会默认把最小的转为0,最亮的转为255):
所以我们可以手动修改下最大最小值:
彩色图也是一样的:
8位整型图像:
注意数值转换,都是在0~255之间的
浮点数图像:
通常情况下,我们习惯用0~1之间的数来表示不同灰度的等级
注意这里要把,vmin=0,vmax=255删掉:
b,g,r = cv.split(img) # 分离
img_new = cv.merge([b,g,r]) # 合并
原图是三个通道,分离后只有一个通道(就是个二维矩阵):
合并下:
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
要将图片最好转换为uint8型,这样好操作
彩色图转灰度图:
thresh是阈值
_,img_bin = cv.threshold(img_gray,th1,th2,cv.THRESH_BINARY)
大于th1的转为th2,小于th1的是0
方法一 - 人工转换:
方法二 - 函数转换:
img = cv.add(img1,img2)
img = cv.addWeighted(img1,alpha,img2,beta,gamma)
img = cv.subtract(img1,img2)
img = cv.multiply(img1,img2)
img = cv.divide(img1,img2)
1、相加:
原因:相加后,有的数字会大于255,这样会循环,所以导致这种情况的出现
原因:这种相加是,只要大于255,就默认为255
解决问题,乘权重:下面这个方法是float型 --- 当然可以前面加np.uint8()强制转换
或者是:下面这个方法是uint8型
2、相减:
方法一:直接相减:
减去的结果,最大值应该是255的一半,因为之前*了0.5
方法二:调用函数:
3、相乘:
4、相除:
noise中有很多0,直接÷的话,会有些错误
解决:转化为浮点型,再加1
img = cv.convertScaleAbs(img,alpha=1,beta=0)
左边的图是Gamma的r取不同值时的图像,所以我们在Gamma中,r通常取1。
线性变换:
方法一:
方法二:
非线性变换:
Gamma变换: