图像处理(1)像素加法
基本读图操作与像素加法
首先我们安装好opencv-python,只需要安装最新版本即可。
1 | import cv2 as cv |
不管是什么版本,在导入的时候,都用上述命令即可,用cv便于书写。
1 | import matplotlib.pyplot as plt |
导入绘图库,将会非常重要。
1 | img_cat = cv.imread("def.jpg", 1); |
1表示以彩色方式读取图像,0表示以灰度模式读取图像,也就是单通道图像,只需要一个矩阵就能表示。
1 | img_dog = cv.imread("anc.jpg", 1) |
加10创建了一个新图像,从原始图像中复制而来,原始图像中每个像素都加10,
1 | img_cat2 = img_cat + 10; |
切片处理中[:5]表示仅仅处理前五行像素,:表示处理所有的列,而0表示通道0,在cv中通道顺序是BGR图像,所以是蓝色。
array([[ 0, 147, 156, ..., 210, 5, 166],
[248, 231, 119, ..., 236, 174, 113],
[192, 193, 229, ..., 204, 154, 106],
[226, 184, 229, ..., 204, 248, 154],
[108, 188, 212, ..., 233, 9, 148]], dtype=uint8)
1 | img_cat[:5, :, 0]#和原来作比较 |
我们可以比较两个像素值。也就是cat+10就是cat2的像素值,我们发现像素都是mod 256的,并且数据类型为unit8。
array([[246, 137, 146, ..., 200, 251, 156],
[238, 221, 109, ..., 226, 164, 103],
[182, 183, 219, ..., 194, 144, 96],
[216, 174, 219, ..., 194, 238, 144],
[ 98, 178, 202, ..., 223, 255, 138]], dtype=uint8)
1 | #我们对现有两个图片做加法 |
(282, 413, 3)
(215, 310, 3)
可以看出两个图像都是彩色图像但是大小并不相同!我们可以用resize来进行图像大小调整。
1 | img1 = cv.resize(img1, (215,310)) |
调整之后大小相同。
只有相同大小(其实即为矩阵大小相同)的两个图像才能做像素加法。
1 | img3 = img1 + img2#注意这里我们看到,后面那个数才是行,前面是列。 |
1 | img3.shape |
可以查看img3就是我们用像素加法合成的图像。
(215, 310, 3)
然后显示图像,这里waitkey(0)表示等待我们按任意键,之后便取消显示。
1 | cv.imshow("img3", img3) |
但是如果仅仅用imshow程序不会显示图像,所以我们可以改用plt绘图。
1 | import cv2 as cv |
1 | #我们发现直接imshow()会程序崩溃,可以改用plt绘图。 |
还可以直接用加法函数
1 | add = cv.add(img1_size, img2_size); |
完成对两个相同大小的图片相加。
按照一定比例混合像素
1 | img1 = cv.imread("abc.jpg") |
其中用到了重要函数addWeighted(img1, alpha, img2, beta, gamma, dtype)
将两幅图像按照一定的比例混合,alpha为第一个图像的占比,beta同理。最后还可以加入dtype参数用于指定图像结果的数据类型,当然默认与输入相同。
gamma用于控制图像的亮度,通常是一个浮点数。
画图
首先加载一个图片
1 | img = cv.imread("me.jpg", cv.IMREAD_COLOR) |
开始绘制
1 | img_size = cv.resize(img, (700, 1500)) |
对特定像素的颜色修改
首先我们取出特定像素。
1 | img = cv2.imread("me.jpg", cv2.IMREAD_COLOR);#读取BGR颜色格式的图片 |
然后进行颜色赋值
1 | img[55, 55] = [255, 255, 255] |
还可以进行成片修改。
1 | img[100:150, 100:150] = [255, 255, 255]#都是修改方式,成片修改,这里是变白 |
写入图片
1 | image = cv.imread("me.jpg") |
这样就完成了格式转换。
用随机字节创建图片
1 | randomByteArray = bytearray(os.urandom(120000))#返回120000字节的数组 |
录像功能,转成视频
先来一点基础摄像头操作的知识,
1 | cap = cv.VideoCapture(0)#启动摄像头 |
然后再来规范一下!
1 | cap = cv.VideoCapture(0)#用第一个摄像头 |
下面再来一个最全面的
1 | import cv2 |
简便读取方式
1 | img = cv.imread("me.jpg", 1)#1读取彩色,0读取黑白! |
图像操作练习
1 | import cv2 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment