Python 计算机视觉(补充版)—— 图像特效中的油画效果

       在前面的文章 Python 计算机视觉(十五)—— 图像特效处理 中我已经介绍了大部分的图像的特效处理,但还是忽略了油画特效的处理,在本篇文章中简单介绍一下油画特效的基本原理以及代码实现,感兴趣的小伙伴可以跟着码一遍代码,或者使用代码直接运行查看一下效果就行。 

目录

一 基本原理

二 代码实现

三 总体实现代码以及保存 

四 结束语


一 基本原理

如下面的两幅图所示,油画用对了地方会使得图像一下子显得文艺起来了呢!

拍出的图像转化为油画

       那么将一幅图像转化为油画类型的图案是怎么实现的呢?为了将一幅普通的图像转化为油画,一般需要以下的几个步骤:
(1)将图像转化为灰度图像

(2)将图像划分为一个个小方框(4*4,6*6...),并统计其中的每一个像素点像素值

(3)对方框中的像素点的的灰度值进行量化(可以参考我之前的关于量化的文章),并对不同的等级的像素点数目进行计数

(4)找到方框中灰度等级最多的像素点,并对这些像素点的灰度值求平均

(5)用平均值代替原像素像素值

二 代码实现

首先还是经典操作,读取图像信息:

"""
Author:XiaoMa
date:2021/12/10
"""
import cv2
import numpy as np
img = cv2.imread(r'E:\From Zhihu\For the desk\cvyouhua.jpg')
img = cv2.resize(img, dsize = None, fx = 0.2, fy = 0.2) #由于该算法计算量较大,首先对其大小进行调整
cv2.imshow('W0', img)
cv2.waitKey(0)
#获取图片宽高
height, width = img.shape[:2]
print(height, width)

得到图像信息如下:

对图像进行油画特效处理,代码已经添加了注释,有注释的不清楚的地方可以在评论区讨论或者私信留言,看到会回复大家的:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像
dst = np.zeros((height, width, 3), np.uint8)#创建一个和原图等大小的全零矩阵
#-----------------------------------------------------------------------
#使用for循环嵌套来遍历图像中的每一个像素点
#-----------------------------------------------------------------------
for i in range(2, height-2):
    for j in range(2, width-2):
        # ----------------------------------------------------------
        # 方框为4*4,对方框内像素点进行量化并记录不同等级的像素点的个数
        # ------------------------------------------------------------
        array1 = np.zeros(8, np.uint8)#将像素点的值量化为8份,定义数组记录不同等级像素点的个数
        for m in range(-2, 2):
            for n in range(-2, 2):
                p1 = int(gray[i+m, j+n]/32)#量化操作
                array1[p1] = array1[p1] + 1#该数组用来记录不同量化级别下的像素点,比如array1[0]代表等级一下的像素点的个数,即像素值为(0~64)的像素点的个数
        #-----------------------------------------------------------
        #在上面的数组中寻找最大值,即寻找数目最多的像素等级
        #------------------------------------------------------------
        currentMax = array1[0]
        l = 0#用来封装最大值在数组中的位置
        for k in range(0, 8):
            if currentMax < array1[k]:
                currentMax = array1[k]
                l = k
        #------------------------
        #求数目最多的像素等级的平均
        #------------------------
        for m in range(-2, 2):
            for n in range(-2, 2):
                if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):
                    (b, g, r) = img[i + m, j + n]
        dst[i, j] = (b, g, r)
cv2.imshow('youhua', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

 得到的结果如下:

三 总体实现代码以及保存 

       总体的代码以及保存方式如下,大家修改一下读取和保存的路径就可以用了,如果想了解一下实现算法可以先敲一遍代码:

"""
Author:XiaoMa
date:2021/12/15
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'E:\From Zhihu\For the desk\cvyouhua.jpg')
img = cv2.resize(img, dsize = None, fx = 0.2, fy = 0.2) #由于该算法计算量较大,首先对其大小进行调整
cv2.imshow('W0', img)
cv2.waitKey(0)
#获取图片宽高
height, width = img.shape[:2]
print(height, width)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像
dst = np.zeros((height, width, 3), np.uint8)#创建一个和原图等大小的全零矩阵
#-----------------------------------------------------------------------
#使用for循环嵌套来遍历图像中的每一个像素点
#-----------------------------------------------------------------------
for i in range(2, height-2):
    for j in range(2, width-2):
        # ----------------------------------------------------------
        # 方框为4*4,对方框内像素点进行量化并记录不同等级的像素点的个数
        # ------------------------------------------------------------
        array1 = np.zeros(8, np.uint8)#将像素点的值量化为8份,定义数组记录不同等级像素点的个数
        for m in range(-2, 2):
            for n in range(-2, 2):
                p1 = int(gray[i+m, j+n]/32)#量化操作
                array1[p1] = array1[p1] + 1#该数组用来记录不同量化级别下的像素点,比如array1[0]代表等级一下的像素点的个数,即像素值为(0~64)的像素点的个数
        #-----------------------------------------------------------
        #在上面的数组中寻找最大值,即寻找数目最多的像素等级
        #------------------------------------------------------------
        currentMax = array1[0]
        l = 0#用来封装最大值在数组中的位置
        for k in range(0, 8):
            if currentMax < array1[k]:
                currentMax = array1[k]
                l = k
        #------------------------
        #求数目最多的像素等级的平均
        #------------------------
        for m in range(-2, 2):
            for n in range(-2, 2):
                if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):
                    (b, g, r) = img[i + m, j + n]
        dst[i, j] = (b, g, r)
cv2.imshow('youhua', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
#------------------------------------------------
#保存图像(以前的文章中介绍过,有不懂的地方可以去考古)
#------------------------------------------------
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
ImgGroup = [img, gray, dst]
ImgTitle = ['原图', '灰度图', '油画']
a = plt.figure(figsize=(30, 10)) #创建画布
for i in range(0, 3):
    ImgGroup[i] = cv2.cvtColor(ImgGroup[i], cv2.COLOR_BGR2RGB)
    plt.subplot(1, 3, i + 1)
    plt.imshow(ImgGroup[i])
    plt.title(ImgTitle[i])
    plt.suptitle('图像油画特效')
    plt.xticks([])
    plt.yticks([])
plt.savefig(r'E:\From Zhihu\For the desk\Acvyouhua.jpg')
plt.show()

得到结果如下:

 

四 结束语

       本篇文章主要介绍了图像特效中的油画效果的基本原理以及代码实现,并简单进行保存处理,感兴趣可以进行学习了解。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python计算机视觉是指使用Python编程语言进行图像处理和计算机视觉任务的技术和工具。Python提供了许多强大的库和框架,使得计算机视觉任务变得更简单和高效。 以下是一些常用的Python计算机视觉库和工具: 1. OpenCV:OpenCV是一个流行的开源计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,包括图像滤波、边缘检测、特征提取和目标跟踪等。 2. scikit-image:scikit-image是一个用于图像处理的Python库,它提供了许多常见的图像处理算法和函数,包括图像滤波、形态学操作、图像分割和特征提取等。 3. TensorFlow和Keras:TensorFlow是一个流行的深度学习框架,而Keras是一个高级神经网络API,可以与TensorFlow一起使用。它们提供了丰富的图像分类、目标检测和图像分割等计算机视觉任务的模型和工具。 4. PyTorch:PyTorch是另一个流行的深度学习框架,它也提供了丰富的计算机视觉任务的模型和工具。PyTorch具有灵活性和易用性的优势,被广泛应用于学术界和工业界。 5. Dlib:Dlib是一个强大的C++计算机视觉库,同时也提供了Python接口。它包含了许多先进的计算机视觉算法,如人脸检测、人脸识别和人脸关键点定位等。 这些库和工具可以帮助开发者进行图像处理、目标检测、图像分类、人脸识别等各种计算机视觉任务。使用Python进行计算机视觉开发可以更快速和便捷,因为Python具有简洁易读的语法和丰富的第三方库支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马归一码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值