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

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

     

  • 相关阅读:
    如何将网格式报表打印成其它样式
    拥有与实力不相称的脾气是种灾难——北漂18年(23)
    8.8.1 Optimizing Queries with EXPLAIN
    mysql 没有rowid 怎么实现根据rowid回表呢?
    secondary index
    8.5.5 Bulk Data Loading for InnoDB Tables 批量数据加载
    mysql 中key 指的是索引
    8.5.4 Optimizing InnoDB Redo Logging 优化InnoDB Redo 日志
    8.5.3 Optimizing InnoDB Read-Only Transactions 优化InnoDB 只读事务
    8.5.1 Optimizing Storage Layout for InnoDB Tables InnoDB表的存储布局优化
  • 原文地址:https://www.cnblogs.com/wydxry/p/10895806.html
Copyright © 2011-2022 走看看