【数字图像处理Python OpenCV实战学习笔记(学习地址:腾讯课堂 - 火力教育 - 数字图像处理Python OpenCV实战)--- (持续更新)】

第1章、基础操作

1.1 开发环境搭建

(1)打开jupyter lab,导入三个包:

import numpy as np
import matplotlib
import cv2

1.2 Jupyterlab使用

(1)命令模式和编辑模式:按“ESC”切换;

(2)向上增加A、向下增加B;按DD删除;

(3)运行:按shift+enter / 按小三角 / ctrl+enter;

(4)Markdown模式:# 后, ctrl +m , 再点m , 之后再点击运行;

(5)raw模式(纯字符串模式):ctrl +m , 再点r

(6)退出模式:ctrl + m + Y

(7)运行逻辑:按照左边编号来运行;

1.3 Numpy科学计算库

(1)三个重要属性:

1、dtype = data type

常用的:float / uint8 / float32

2、shape (几 X 几 的矩阵)

3、ndim = n dimension

(2)矩阵创建:

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)

 (3)矩阵转换:

1、.reshape() --- 重塑

 2、.flatten() --- 拉平

3、.ravel() --- 拍扁

4、.T --- 转置

5、.transpose() --- 转置

6、np.hstack([A,B]) --- 水平堆叠在一起 

7、np.vstack([A,B]) --- 垂直堆叠在一起

(4)最大值、最小值、平均值:

1、最大值:.max()

2、最小值:.min()

3、平均值:.mean()

或者是:

 4、每行最大值:

5、每列最大值:

 (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)

(6)元素获取:

1、取第0行:

2、取第一列:

3、区域切割:

4、取某个元素:

5、某元素赋值:

6、某行赋值:

1.4 OpenCV读写图片

(1)图片读写及显示:

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() ##正常显示图片函数

使用如下:

1.5 Matplotlib绘图

(1)折线图

(2)稍微复杂点的:

(3)直方图:

第二章、图像基础

2.1 二值图、灰度图、彩色图

(1)基础知识:

简单说明:

真彩色是每一位都是0-255 ,表示红/绿/蓝的程度(24位);

假彩色与灰度图类似,只不过是用256种取值都是彩色(8位);

图像处理的运算,是循环运算:比如1-2 =255

2.2 图像的矩阵表示

(1)基础知识:

 上图为:2 x 4 的分辨率

上面是红色通道;中间是绿色通道;下面是蓝色通道;

左上角的点,实际上是:(255,127,127) ,彩色图可以拆分为三个通道(R、G、B),每一个通道都相当于是一个灰度图。

有的时候,我们想把一个彩色图转换为一个灰度图,只需要取其中 一个通道即可;或者是如上式那样进行一个加权。上式的权值是根据人眼来调的,取1,0,0也ok。

(2)图像基础练习:

首先导包:

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删掉:

(3)通道分离与合并:

b,g,r = cv.split(img)         # 分离
img_new = cv.merge([b,g,r])   # 合并

原图是三个通道,分离后只有一个通道(就是个二维矩阵):

合并下:

(4)彩色图转灰度图:

img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

要将图片最好转换为uint8型,这样好操作

彩色图转灰度图:

 

(5)图像二值化(灰度图转化为二值图):

thresh是阈值

_,img_bin = cv.threshold(img_gray,th1,th2,cv.THRESH_BINARY)

大于th1的转为th2,小于th1的是0

方法一 - 人工转换:

 

方法二 - 函数转换:

2.3 图像相加、相减、相乘、相除

(1)基础知识:

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)

 

(2)练习:

1、相加:

原因:相加后,有的数字会大于255,这样会循环,所以导致这种情况的出现

 

原因:这种相加是,只要大于255,就默认为255

解决问题,乘权重:下面这个方法是float型 --- 当然可以前面加np.uint8()强制转换

或者是:下面这个方法是uint8型

2、相减:

方法一:直接相减:

减去的结果,最大值应该是255的一半,因为之前*了0.5

 

方法二:调用函数:

 

 

 3、相乘:

 4、相除:

 noise中有很多0,直接÷的话,会有些错误

解决:转化为浮点型,再加1

 

2.4 图像线性和非线性变换

(1)基础知识:

img = cv.convertScaleAbs(img,alpha=1,beta=0)

 

 左边的图是Gamma的r取不同值时的图像,所以我们在Gamma中,r通常取1。

(2)练习:

线性变换:

方法一:

方法二:

非线性变换:

Gamma变换:

2.5 实例:图像融合

(1)任务要求:将 花、刺猬、mask三张图融合到一起

 

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不错就是对

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值