• 计算机视觉之图像特效(实现图像边缘检测、浮雕效果、颜色映射、油画特效等功能)


    1.图像边缘检测

    图像的边缘检测:实质是对图像进行卷积运算。

    实现canny边缘检测步骤:

    1. 转换为灰度图
    2. 进行高斯滤波
    3. canny方法实现边缘检测 

     调用api实现canny边缘检测,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 转化为灰度图
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 # 高斯滤波 模板大小为3*3
    12 imgG = cv2.GaussianBlur(gray,(3,3),0)
    13 # 调用canny方法 设置门限 大于门限则为边缘点
    14 dst = cv2.Canny(img,50,50)
    15 cv2.imshow('dst',dst)
    16 cv2.waitKey(0)

    运行结果如下:

    src为原始图像:

    dst为边缘检测处理后的图像:

    手动实现图像边缘检测算法,以及相应的优化,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 import math
     5 img = cv2.imread('image2.jpg', 1)
     6 imgInfo = img.shape
     7 height = imgInfo[0]
     8 width = imgInfo[1]
     9 cv2.imshow('src',img)
    10 # sobel
    11 # 1 算子模板 第一个为y方向上的 第二个为x方向的
    12 # [ 1  2  1     [1 0 -1]
    13 #   0  0  0      2 0 -2
    14 #  -1 -2 -1]     1 0 -1]
    15 # 2 图片卷积
    16 # [1 2 3 4][a b c d] a*1+b*2+c*3+d*4 = dst
    17 # 3 阈值判决
    18 # sqrt(a*a+b*b) = f>th
    19 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    20 dst = np.zeros((height,width,1),np.uint8)
    21 for i in range(0,height-2):
    22     for j in range(0,width-2):
    23         # y方向上的梯度
    24         # gy = gray[i,j]*1+gray[i,j+1]*2+gray[i,j+2]*1-gray[i+2,j]*1-gray[i+2,j+1]*2-gray[i+2,j+2]*1
    25         # 优化 y方向上的梯度
    26         gy = gray[i,j]+(gray[i,j+1]<<1)+gray[i,j+2]-gray[i+2,j]-(gray[i+2,j+1]<<1)-gray[i+2,j+2]
    27         # x方向上的梯度
    28         # gx = gray[i,j]*1+gray[i+1,j]*2+gray[i+2,j]*1-gray[i,j+2]*1-gray[i+1,j+2]*2-gray[i+2,j+2]*1
    29         # 优化 x方向上的梯度
    30         gx = gray[i,j]+(gray[i+1,j]<<1)+gray[i+2,j]-gray[i,j+2]-(gray[i+1,j+2]<<1)-gray[i+2,j+2]
    31         # 梯度
    32         grad = math.sqrt(int(gx*gx+gy*gy))
    33         # 判断是否超过阈值
    34         if grad > 50:
    35             dst[i,j] = 255
    36         else:
    37             dst[i,j] = 0
    38 cv2.imshow('dst',dst)
    39 cv2.waitKey(0)

    运行结果如下:

    src为初始图像:

    dst为边缘检测处理后的图像:

    2.浮雕效果

    浮雕效果:newP = gray0-gray1+150(特定值) 即当前像素等于相邻像素之差再加上一个特定值突出灰度 即边缘特征,设定不同的特征值的时候会出现不同的浮雕效果。
    测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 转化为灰度图
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 dst = np.zeros((height,width,1),np.uint8)
    12 for i in range(0,height):
    13     for j in range(0,width-1):
    14         grayP0 = int(gray[i,j])
    15         grayP1 = int(gray[i,j+1])
    16         newP = grayP0-grayP1+50
    17         if newP > 255:
    18             newP = 255
    19         if newP < 0:
    20             newP = 0
    21         dst[i,j] = newP
    22 cv2.imshow('dst',dst)
    23 cv2.waitKey(0)

    运行结果如下:

    src初始图像:

    dst浮雕效果图像:(特定值为150的时候)

    dst浮雕效果图像:(特定值为50的时候)

    3.颜色映射

    颜色映射按照我的理解就是一个颜色对应上另一个颜色,比如蓝色对应红色,那么一副纯蓝色的图像就会被映射为一副纯红色的图像。

    颜色映射的实现方法:可以建立一张颜色映射表,另外一种简单的方法是对rgb分别乘上一个系数,以下面实现一个“蓝色效果”为例,b=b*1.5 g=g*1.3 r=r,测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('image0.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     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         b = b * 1.5
    14         g = g * 1.3
    15         # 防止越界操作
    16         if b > 255:
    17             b = 255
    18         if g > 255:
    19             g = 255
    20         dst[i,j] = (b,g,r)
    21 cv2.imshow('dst',dst)
    22 cv2.waitKey(0)

    运行结果如下:

    src为初始图像:

    dst为蓝色效果图像:

    4.油画特效

    油画特效
    1 gray
    2 统计方块中的灰度值
    3 对灰度值进行分段
    4 对灰度值取平均作为结果

    测试代码如下:

     1 import cv2
     2 import numpy as np
     3 import random
     4 img = cv2.imread('Jerry.jpg', 1)
     5 imgInfo = img.shape
     6 height = imgInfo[0]
     7 width = imgInfo[1]
     8 cv2.imshow('src',img)
     9 # 灰度化
    10 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    11 dst = np.zeros((height,width,3),np.uint8)
    12 for i in range(4,height-4):
    13     for j in range(4,width-4):
    14         array1 = np.zeros(8,np.uint8)
    15         for m in range(-4,4):
    16             for n in range(-4,4):
    17                 p1 = int(gray[i+m,j+n]/32)
    18                 array1[p1] = array1[p1]+1
    19         currentMax = array1[0]
    20         l = 0
    21         for k in range(0,8):
    22             if currentMax < array1[k]:
    23                 currentMax = array1[k]
    24                 l=k
    25         for m in range(-4,4):
    26             for n in range(-4,4):
    27                 if gray[i+m,j+n] >= (l*32) and gray[i+m,j+n] <= ((l+1)*32):
    28                     (b,g,r) = img[i+m,j+n]
    29         dst[i,j] = (b,g,r)
    30 cv2.imshow('Jerry',dst)
    31 cv2.waitKey(0)

    运行结果如下:

    src为原始图像:

    Jerry是处理后的图像:

  • 相关阅读:
    ssh-keygen Linux 免密登录
    hostnamectl 修改 CentOS7 主机名
    微信公众平台开发—24点游戏
    微信公众平台开发—起步
    java的静态代理和动态代理(jdk、cglib)
    UEditor上传图片到七牛云储存(java)
    第四十篇-private,public,protected的区别
    第七篇--ubuntu18.04下面特殊符号
    6. 计算器界面
    第六篇--Ubuntu画图软件
  • 原文地址:https://www.cnblogs.com/wydxry/p/10899102.html
Copyright © 2020-2023  润新知