OpenCV-Python实现油画效果的实例

 更新时间:2021年06月08日 15:47:21   作者:一天一篇Python库  
OpenCV是功能强大的计算机视觉库,本文主要使用OpenCV来实现图片的油画效果,需要的朋友们下面随着小编来一起学习学习吧

油画的实现原理

油画简单的理解是带有艺术感的图像,色彩相对于原图要更加鲜艳,但却是失真的。

而且对于喜欢欣赏艺术的读者,肯定或多或少关注过油画,油画并不细腻,而且小部分因为色块的堆积非常模糊。所以,我们实现油画的原理是:逐行对图像进行处理,使周围相邻距离的像素进行打乱。

至于打乱的算法,你可以随机设计。不过,需要注意的是在处理到图像边缘时,比如左下角最后一个像素,那么如果打乱其像素,取右边的显然不可取,因为右边没有像素会导致数组越界。所以在处理油画时,可以人为的剪掉部分边缘像素用于混淆。

还有,油画因为用色大胆,所以我们需要增强图像的色彩空间。而python的PIL库有一个现成的类ImageEnhance。该类专门用于图像的增强处理,不仅可以增强图像的亮度,对比度,色度,还可以增强图像的锐度,因此我们实现油画可以通过它快速实现图像增强的操作。

下面,我们来看看其图像增强如何实现。代码如下:

enh_col=ImageEnhance.Color(img)
color = 2.0
new_img = enh_col.enhance(color)

此处的img是PIL读取的图片,如果想PIL读取图片转到OpenCV读取图片的格式可以通过如下代码完成:

new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR)

其中,new_img为PIL读取的图片格式。

而enhance函数的参数color代表了图像色彩的丰富程度和饱和度,数值为1时保持色度不变,数值增加表示色度比例增加,以此达到图像增强的效果。

实现油画效果

既然已经了解了实现油画效果的原理。下面,我们直接上代码来完成油画的操作。具体代码如下所示:

# 油画效果
def oil_effect(img):
    h, w, n = img.shape
    new_img = np.zeros((h - 2, w, n), dtype=np.uint8)
    for i in range(h - 2):
        for j in range(w):
            if random.randint(1, 10) % 3 == 0:
                new_img[i, j] = img[i - 1, j]
            elif random.randint(1, 10) % 2 == 0:
                new_img[i, j] = img[i + 1, j]
            else:
                new_img[i, j] = img[i + 2, j]
    return new_img


# 图像增强
def img_add():
    img = Image.open("oil.jpg")
    enh_col = ImageEnhance.Color(img)
    color = 2.0
    new_img = enh_col.enhance(color)
    new_img = cv2.cvtColor(np.asarray(new_img), cv2.COLOR_RGB2BGR)
    return new_img


if __name__ == "__main__":
    img = cv2.imread("49.jpg")
    oil_img = oil_effect(img)
    cv2.imwrite("oil.jpg", oil_img)
    cv2.imshow("0", img)
    cv2.imshow("1", img_add())
    cv2.waitKey()
    cv2.destroyAllWindows()

运行之后,效果如下:

油画效果

水彩效果

像油画效果一样,水彩效果也可以用单行代码完成,但不包括导入和图像读取。

cv2.stylization()

import cv2

img = cv2.imread('img.jpg')

res = cv2.stylization(img, sigma_s=60, sigma_r=0.6)

# sigma_s controls the size of the neighborhood. Range 1 - 200

# sigma_r controls the how dissimilar colors within the neighborhood will be averaged. A larger sigma_r results in large regions of constant color. Range 0 - 1

到此这篇关于OpenCV-Python实现油画效果的实例的文章就介绍到这了,更多相关OpenCV 油画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • opencv 实现特定颜色线条提取与定位操作

    opencv 实现特定颜色线条提取与定位操作

    这篇文章主要介绍了opencv 实现特定颜色线条提取与定位操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 使用pth文件添加Python环境变量方式

    使用pth文件添加Python环境变量方式

    这篇文章主要介绍了使用pth文件添加Python环境变量方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 详解Python Matplot中文显示完美解决方案

    详解Python Matplot中文显示完美解决方案

    这篇文章主要介绍了Python Matplot中文显示完美解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解

    使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析。Python的logging模块就是这种情况下的好帮手。本文就介绍了python中日志logging模块性能及多进程的相关资料,需要的朋友可以参考下。
    2017-07-07
  • python包和文件夹有的区别点总结

    python包和文件夹有的区别点总结

    在本篇文章里小编给大家整理的是一篇关于python包和文件夹有的区别点总结内容,有兴趣的朋友们可以学习参考下。
    2021-09-09
  • python单例模式的应用场景实例讲解

    python单例模式的应用场景实例讲解

    在本篇文章里小编给大家整理的是一篇关于python单例模式的应用场景实例讲解内容,有兴趣的朋友们可以学习下。
    2021-02-02
  • python中map()函数的使用方法示例

    python中map()函数的使用方法示例

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。下面这篇文章主要给大家介绍了关于python中map()函数的使用方法,需要的朋友可以参考下
    2017-09-09
  • Python matplotlib设置多子图、子图间距及外边距的几种方式

    Python matplotlib设置多子图、子图间距及外边距的几种方式

    子图是Matplotlib中强大的功能之一,使用函数您可以方便地创建多个子图,并使用Axes对象绘制各种图形,下面这篇文章主要给大家介绍了关于Python matplotlib设置多子图、子图间距及外边距的几种方式,需要的朋友可以参考下
    2024-02-02
  • django第一个项目127.0.0.1:8000不能访问的解决方案详析

    django第一个项目127.0.0.1:8000不能访问的解决方案详析

    django项目服务启动后无法通过127.0.0.1访问,下面这篇文章主要给大家介绍了关于django第一个项目127.0.0.1:8000不能访问的解决方案,需要的朋友可以参考下
    2022-10-10
  • Python 切分数组实例解析

    Python 切分数组实例解析

    这篇文章主要介绍了Python 切分数组实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论