import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 展示图片
def show(img):
if img.ndim == 2:
plt.imshow(img, cmap='gray')
else:
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.show()
图片的数字存储
灰度图用二维矩阵表示,RGB彩色图用三维矩阵表示。
3个灰度图 融合成 彩色图
b = np.array([
[0, 127, 255],
[255, 0, 255],
[10, 50, 100]
], dtype=np.uint8)
g = b.T
r = b - g
show(b)
show(cv.merge([r, g, b]))
图片的颜色转换
## 1. 图像读取
img = cv.imread('pic/bear500x333.jpg')
show(img)
## 2. 彩色图转灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
show(img_gray)
## 3. 二值化图像(灰度图转二值图)
# 灰度值在125以上的,变成240
_, img_bin = cv.threshold(img_gray, 125, 240, cv.THRESH_BINARY)
show(img_bin)
图像保存
## 4. 保存图像
cv.imwrite('pic/bear_gray.jpg', img_gray)
True
通道分离与合并
## 5. 通道分离
b, g, r = cv.split(img)
## 6. 通道合并
img_new = cv.merge([b, g, r])
show(img_new)
加减乘除
# 背景
bg = cv.imread('pic/line500x500.jpg', 0)
# 前景
ob = cv.imread('pic/hedgehog500x500.jpg', 0)
show(np.hstack([bg, ob]))
# 图像相加
## 如果灰度值超出255,则进入下一个 0~255的循环
# img_add = cv.add(bg*0.5, ob*0.5)
img_add = bg * 0.5 + ob * 0.5
show(img_add)
# 图像相减
# img_sub = img_add - bg * 0.5
img_sub = cv.subtract(img_add, bg * 0.5)
show(img_sub)
# 图像相乘
# 掩膜
mask = cv.imread('pic/mask500x500.jpg', 0)
show(np.hstack([ob, mask]))
img_mul = cv.multiply(ob/1.0, mask/255)
show(img_mul)
# 图像相除
ob_noise = cv.imread('pic/hedgehog_noise_500x500.jpg', 0)
show(np.hstack([ob, ob_noise]))
img_div = cv.divide(ob, ob_noise+1)
show(img_div)
图像像素非线性变换
逐像素运算就是对图像中的每一个像素点的亮度值,通过一定的函数关系,转换到新的亮度值。
这个转换可以由函数表示:s=f®
其中r为原来的像素值,s为新的像素值。
img2 = cv.convertScaleAbs(img, alpha=1, beta=0)
线性变换:
s
=
b
+
k
r
s = b + kr
s=b+kr
非线性变换:
s
=
a
+
l
n
(
r
+
1
)
b
s = a + \frac{ln(r+1)}{b}
s=a+bln(r+1)
gamma变换:
s
=
c
r
γ
s = cr^\gamma
s=crγ
实例:图像融合
# 实例
bg = cv.imread('pic/petal500x500.jpg')
ob = cv.imread('pic/hedgehog500x500.jpg')
mask = cv.imread('pic/mask500x500.jpg')
show(np.hstack([bg, ob, mask]))
# 前景选择
ob_select = np.float32(ob/1.0) * np.float32(mask/255.0)
show(np.uint8(ob_select))
# 背景选择
bg_select = np.float32(bg/1.0) * np.float32(1-mask/255.0)
show(np.uint8(bg_select))
# 图像融合
nice = cv.add(ob_select*0.8, bg_select).astype(np.uint8)
show(nice)
# 保存图片
cv.imwrite('pic/image_mix.jpg', np.hstack([bg, ob, nice]))
True