计算机视觉之图像特效(实现图像灰度处理、颜色反转、马赛克、毛玻璃、图片融合等功能)
1.图像灰度处理
下面介绍四种图像灰度处理的方法:
方法1:cv2中的imread(参数:0表示为灰度图片,1表示为彩色图片)
测试代码如下:
1 import cv2 2 # 方法1 imread 3 img0 = cv2.imread('image0.jpg', 0) # 0 为灰度图片 1 为彩色图片 4 img1 = cv2.imread('image0.jpg', 1) 5 print(img0.shape) 6 print(img1.shape) 7 cv2.imshow('src0',img0) 8 cv2.imshow('src1',img1) 9 cv2.waitKey(0)
运行结果如下:
src0为灰度图像:
src1为彩色图像:
方法 2:cvtColor
测试代码如下:
1 # 方法2 cvtColor 2 import cv2 3 img = cv2.imread('image0.jpg', 1) 4 dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 完成颜色空间的转换 从bgr模式转化为灰度模式 5 cv2.imshow('dst', dst) 6 cv2.waitKey(0)
运行结果如下:
同样的可以转化为灰度图像:
方法3:对RGB三个分量取均值
1 # 方法3 RGB R=G=B gray=(R+G+B)/3 2 import cv2 3 import numpy as np 4 img = cv2.imread('image0.jpg', 1) 5 cv2.imshow('src',img) 6 imgInfo = img.shape 7 height = imgInfo[0] 8 width = imgInfo[1] 9 dst = np.zeros((height,width,3),np.uint8) 10 for i in range(0,height): 11 for j in range(0,width): 12 (b,g,r) = img[i,j] 13 gray = (int(b)+int(g)+int(r))/3 # 防止数据溢出 14 dst[i,j] = np.uint8(gray) 15 cv2.imshow('dst',dst) 16 cv2.waitKey(0)
运行结果:略
方法4:对rbg加权 gray = r*0.299+g*0.587+b*0.114
1 # 方法4 对rbg加权 2 # gray = r*0.299+g*0.587+b*0.114 3 import cv2 4 import numpy as np 5 img = cv2.imread('image0.jpg', 1) 6 cv2.imshow('src',img) 7 imgInfo = img.shape 8 height = imgInfo[0] 9 width = imgInfo[1] 10 dst = np.zeros((height,width,3),np.uint8) 11 w = [0.299, 0.587, 0.114] 12 for i in range(0,height): 13 for j in range(0,width): 14 (b,g,r) = img[i,j] 15 gray = r*0.299+g*0.587+b*0.114 16 dst[i,j] = np.uint8(gray) 17 cv2.imshow('dst',dst) 18 cv2.waitKey(0)
运行结果:略
图像转灰度算法优化:
原因:
- 重要
- 基础
- 实时性
优化方法:
- 定点运算优于浮点运算
- 减法优于乘除
- 移位运算优于乘除
测试代码如下:
1 import cv2 2 import numpy as np 3 img = cv2.imread('image0.jpg', 1) 4 cv2.imshow('src',img) 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 dst = np.zeros((height,width,3),np.uint8) 9 for i in range(0,height): 10 for j in range(0,width): 11 (b,g,r) = img[i,j] 12 b = int(b) 13 g = int(g) 14 r = int(r) 15 # gray = (int(b) + int(g) + int(r)) / 3 # 防止数据溢出 16 gray = (r+(g << 1)+b) >> 2 # 浮点转化成了定点 r和b乘以1省略掉 乘除转化为移位运算 但是会损失一点精度 17 dst[i,j] = np.uint8(gray) 18 cv2.imshow('dst',dst) 19 cv2.waitKey(0)
运行结果如下:
src为彩色的原始图像:
dst为转化为灰度的目标图像:
其实可以通过算法优化的图像对比前面四种方法处理后的图像,可以知道,其实效果都差不多,但是性能显著提升!
2.颜色反转
颜色反转分为:灰度图的颜色反转和RGB图的颜色反转,但是本质上都是一样的,取反操作即对每个像素点进行取反得到新的像素值,或者用255-当前像素值(八位的时候)。
1.灰度图的颜色反转,测试代码如下:
1 import cv2 2 import numpy as np 3 img = cv2.imread('image0.jpg', 1) 4 cv2.imshow('src',img) # 彩色图 5 imgInfo = img.shape 6 height = imgInfo[0] 7 width = imgInfo[1] 8 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转化为灰度图 9 cv2.imshow('gray',gray) 10 dst = np.zeros((height,width,1),np.uint8) 11 for i in range(0,height): 12 for j in range(0,width): 13 dst[i,j] = 255-gray[i,j] 14 # 也可以通过取反得到,效果是一样的,下面一行是取反的操作,能够实现同样的效果 15 # dst[i,j] = ~gray[i,j] 16 cv2.imshow('dst',dst) # 灰度图反转后的图像 17 cv2.waitKey(0)
运行结果如下:(src为初始的彩色图像,gray为转化的灰度图,dst为灰度图反转后的图像)
src:略
gray:
dst:
2.RGB彩色图像的反转,测试代码如下:
1 # RGB 颜色反转 [255,255,255]-当前像素值[b,g,r] 2 import cv2 3 import numpy as np 4 img = cv2.imread('image0.jpg', 1) 5 cv2.imshow('src',img) 6 imgInfo = img.shape 7 height = imgInfo[0] 8 width = imgInfo[1] 9 dst = np.zeros((height,width,3),np.uint8) 10 w = [255, 255, 255] 11 for i in range(0,height): 12 for j in range(0,width): 13 dst[i,j] = w - img[i,j] 14 cv2.imshow('dst',dst) 15 cv2.waitKey(0)
运行结果如下:
src为RGB原始图像:
dst为RGB图像反转后的图像:
3.图片马赛克化
马赛克效果:实质是在一个小矩阵范围内随机取一个像素进行填充(即代替矩形框中其他的像素)。
参考示例,便于理解:
图片马赛克化,测试代码如下:
1 # 马赛克效果:实质是在一个小矩阵范围内随机取一个像素进行填充(即代替矩形框中其他的像素) 2 import cv2 3 import numpy as np 4 img = cv2.imread('image0.jpg', 1) 5 cv2.imshow('src',img) 6 imgInfo = img.shape 7 height = imgInfo[0] 8 width = imgInfo[1] 9 # 将图像中从点(200,400)到点(400,600)进行马赛克处理 10 for m in range(200,400): 11 for n in range(400,600): 12 # pixel -》10*10 13 if m%10 == 0 and n%10 == 0: 14 for i in range(0,10): 15 for j in range(0,10): 16 (b,g,r) = img[m,n] 17 img[i+m,j+n]=(b,g,r) 18 cv2.imshow('dst',img) 19 cv2.waitKey(0)
运行效果如下:
src原始图像:
dst马赛克化后的图像:(图中的圈为马赛克效果)
4.图片毛玻璃化
毛玻璃效果:是一个随机替换的过程,实质在一个小范围内随机取一个像素进行替换。
参考示例,便于理解:
图片毛玻璃化,测试代码如下:
1 # 毛玻璃效果:是一个随机替换的过程,实质在一个小范围内随机取一个像素进行替换 2 import cv2 3 import numpy as np 4 import random 5 img = cv2.imread('image0.jpg', 1) 6 cv2.imshow('src',img) 7 imgInfo = img.shape 8 height = imgInfo[0] 9 width = imgInfo[1] 10 dst = np.zeros((height,width,3),np.uint8) 11 mm = 8 12 # 减去mm防止越界 边框未填充所以为0是黑色 13 for m in range(0, height-mm): 14 for n in range(0, width-mm): 15 index = int(random.random()*8) 16 (b,g,r) = img[m+index,n+index] 17 dst[m,n] = (b,g,r) 18 cv2.imshow('dst',dst) 19 cv2.waitKey(0)
运行效果如下:
dst毛玻璃化的目标图像:
5.图片融合
图片融合:实质上是对多个图像进行加权求和,生成新的图像,不同的权值组合可以生成不同的图像。
以两个图像的融合为例:dst = src1*a+src2*(1-a),亦即:目标图像 = 第一幅图像 * 第一幅图像的权值 + 第二幅图像 * 第二幅图像的权值 。
下面是图片融合的测试代码:
1 # 图片融合:对多个图像进行加权求和 2 # dst = src1*a+src2*(1-a) 3 import cv2 4 import numpy as np 5 img0 = cv2.imread('image0.jpg', 1) 6 img1 = cv2.imread('image1.jpg', 1) 7 cv2.imshow('src0',img0) 8 cv2.imshow('src1',img1) 9 imgInfo = img0.shape 10 height = imgInfo[0] 11 width = imgInfo[1] 12 # ROI 13 roiH = int(height/2) 14 roiW = int(width/2) 15 img0ROI = img0[0:roiH,0:roiW] 16 img1ROI = img1[0:roiH,0:roiW] 17 # dst 18 dst = np.zeros((roiH,roiW,3),np.uint8) 19 # 调用cv2的api进行图片融合:addWeighted方法,前面四个参数分别对应pic1的信息,pic1的权重,pic2的信息,pic2的权重 20 # dst = src1*a+src2*(1-a) 21 dst = cv2.addWeighted(img0ROI,0.3,img1ROI,0.7,0) 22 cv2.imshow('dst',dst) 23 cv2.waitKey(0)
运行结果如下:
src0第一幅图像:
src1第二幅图像:
dst融合后的目标图像: