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

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是处理后的图像:

 

转载于:https://www.cnblogs.com/shixinzei/p/10899102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python可以实现多种图像特效,比如浮雕、底片、哈哈镜、油画、素描、泛黄等。浮雕特效可以通过将RGB三值与相邻像素差值作差得到。底片特效可以通过将RGB三值与255作差得到。哈哈镜特效可以通过对图像进行放大或缩小来达到拉伸效果油画特效可以通过模糊图像的方式来实现。素描特效可以通过将图像转化为灰度图,并利用边缘检测算法来突出图像的轮廓。泛黄特效可以通过调整RGB三值的比例来使图像呈现出泛黄的色调。以上是一些常见的图像特效,使用Python编程语言可以很方便地实现这些特效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python 图像特效处理实现](https://blog.csdn.net/Wadewhl/article/details/112941419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python 计算机视觉(十五)—— 图像特效处理](https://blog.csdn.net/qq_52309640/article/details/120941346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值