• 计算机视觉之图像特效(实现图像灰度处理、颜色反转、马赛克、毛玻璃、图片融合等功能)


    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融合后的目标图像:

     

  • 相关阅读:
    再见了亲爱的学生们,再见了敬爱的同事们,再见了信狮
    #if defined 和#ifdef的区别
    C# ASP.NET Core开发学生信息管理系统(二)
    modelsim与debussy联合的问题
    C#批量生成大数据量无重复随机数据的另类高效实现
    DataColumn.Caption属性应用到DataGridView.HeaderText的方法
    [转载]安装网银安全控件
    近期学习SQL Server,收藏的几个学习教程网址备忘
    asp.net根据域名查ip C#版
    asp.net 2.0教程 成员资格和角色管理
  • 原文地址:https://www.cnblogs.com/wydxry/p/10895806.html
Copyright © 2020-2023  润新知