[Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效

举报
eastmount 发表于 2021/08/24 00:58:53 2021/08/24
【摘要】 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。本文将继续补充常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,希望文章对您有所帮助。

前面一篇文章我讲解了傅里叶变换、基于傅里叶变换的高通滤波和低通滤波。本文将继续补充常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现。基础性文章,希望对你有所帮助,一起加油喔~

  • 一.图像毛玻璃特效
  • 二.图像浮雕特效
  • 三.图像油漆特效
  • 四.本文小结

该系列在github所有源代码:

PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

前文参考:


一.图像毛玻璃特效

图像毛玻璃特效如图所示,左边为原始图像,右边为毛玻璃特效图像。它是用图像邻域内随机一个像素点的颜色来替代当前像素点颜色的过程,从而为图像增加一个毛玻璃模糊的特效。

PS:该图片为作者去喀纳斯拍摄,真心美!

Python实现代码主要是通过双层循环遍历图像的各像素点,再用定义的随机数去替换各邻域像素点的颜色,具体代码如下所示。

#coding:utf-8
import cv2
import numpy as np

#读取原始图像
src = cv2.imread('scenery.png')

#新建目标图像
dst = np.zeros_like(src)

#获取图像行和列
rows, cols = src.shape[:2]

#定义偏移量和随机数
offsets = 5
random_num = 0

#毛玻璃效果: 像素点邻域内随机像素点的颜色替代当前像素点的颜色
for y in range(rows - offsets):
    for x in range(cols - offsets):
        random_num = np.random.randint(0,offsets)
        dst[y,x] = src[y + random_num,x + random_num]

#显示图像
cv2.imshow('src',src)
cv2.imshow('dst',dst)

cv2.waitKey()
cv2.destroyAllWindows()

二.图像浮雕特效

图像浮雕特效是仿造浮雕艺术而衍生的处理,它将要呈现的图像突起于石头表面,根据凹凸程度不同形成三维的立体效果。Python绘制浮雕图像是通过勾画图像的轮廓,并降低周围的像素值,从而产生一张具有立体感的浮雕效果图。传统的方法是设置卷积核,再调用OpenCV的filter2D()函数实现浮雕特效。该函数主要是利用内核实现对图像的卷积运算,其函数原型如下所示:

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

  • src表示输入图像
  • dst表示输出的边缘图,其大小和通道数与输入图像相同
  • ddepth表示目标图像所需的深度
  • kernel表示卷积核,一个单通道浮点型矩阵
  • anchor表示内核的基准点,其默认值为(-1,-1),位于中心位置
  • delta表示在储存目标图像前可选的添加到像素的值,默认值为0
  • borderType表示边框模式

核心代码如下:

kernel = np.array([[-1,0,0],[0,1,0],[0,0,0]])
output = cv2.filter2D(src, -1, kernel)

本小节将直接对各像素点进行处理,采用相邻像素相减的方法来得到图像轮廓与平面的差,类似边缘的特征,从而获得这种立体感的效果。为了增强图片的主观感受,还可以给这个差加上一个固定值,如150。实现效果如图所示。

Python通过双层循环遍历图像的各像素点,使用相邻像素值之差来表示当前像素值,从而得到图像的边缘特征,最后加上固定数值150得到浮雕效果,具体代码如下所示。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

#读取原始图像
img = cv2.imread('scenery.png', 1)

#获取图像的高度和宽度
height, width = img.shape[:2]

#图像灰度处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#创建目标图像
dstImg = np.zeros((height,width,1),np.uint8)

#浮雕特效算法:newPixel = grayCurrentPixel - grayNextPixel + 150
for i in range(0,height):
    for j in range(0,width-1):
        grayCurrentPixel = int(gray[i,j])
        grayNextPixel = int(gray[i,j+1])
        newPixel = grayCurrentPixel - grayNextPixel + 150
        if newPixel > 255:
            newPixel = 255
        if newPixel < 0:
            newPixel = 0
        dstImg[i,j] = newPixel
        
#显示图像
cv2.imshow('src', img)
cv2.imshow('dst',dstImg)

#等待显示
cv2.waitKey()
cv2.destroyAllWindows()

三.图像油漆特效

图像油漆特效类似于油漆染色后的轮廓图形,它主要采用自定义卷积核和cv2.filter2D()函数实现,Python实现代码主要通过Numpy定义卷积核,再进行特效处理,卷积核如公式(13-1)所示,其中心权重为10,其余值均为-1。

完整代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np

#读取原始图像
src = cv2.imread('scenery.png')

#图像灰度处理
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#自定义卷积核
kernel = np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]])

#图像浮雕效果
output = cv2.filter2D(gray, -1, kernel)

#显示图像
cv2.imshow('Original Image', src)
cv2.imshow('Emboss_1',output)

#等待显示
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如下图所示:


四.本文小结

讲到这里,作者将分享的几个特效就讲解完毕,后续将继续分享包括素描、黄昏、灯光、流光等效果,希望读者喜欢。最后补充作者五一假期的一些感受!

《这些年璋娜去过的地方》
一座城市,一道文化。一个故事,两个主角。
这些年璋娜走过的山河,陪你感受这大千世界,
留下的片片剪影和段段文字,异样的人生,精彩的生活。

青海•茶卡盐湖 2017-8-30。纯洁、清澈、蓝白交织,如同一场梦境,美得恍如隔世,它就是“天空之境”茶卡盐湖。

新疆•伊犁赛里木湖 2018-9-15。大西洋上最后的一滴眼泪,总闪烁着圣洁迷人的样子,不挂一丝,不染一尘。这就是伊犁的赛里木湖。站在空中草原拉那提,自己是那么的渺小,人生那些破事根本不值一提,热爱生命,敬畏自然。

(By:娜璋之家 Eastmount 2021-08-21 夜于贵阳)


参考文献:

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。