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

作者:一天一篇Python库 时间:2022-03-26 09:16:37 

油画的实现原理

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

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

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

还有,油画因为用色大胆,所以我们需要增强图像的色彩空间。而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()

运行之后,效果如下:

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

水彩效果

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

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实现油画效果的实例

来源:https://liyuanjinglyj.blog.csdn.net/article/details/115137927

标签:OpenCV,油画
0
投稿

猜你喜欢

  • asp修改文件和文件夹的名字的代码

    2011-04-11 11:04:00
  • Django框架表单操作实例分析

    2022-01-27 23:43:59
  • 一篇文章弄懂PHP和HTML的嵌套写法

    2023-06-20 04:51:22
  • Python import自己的模块报错问题及解决

    2023-11-09 15:57:08
  • Python中Parser的超详细用法实例

    2022-05-02 10:16:30
  • Python使用pandas导入xlsx格式的excel文件内容操作代码

    2022-03-12 04:29:57
  • sql注入与转义的php函数代码

    2023-07-16 11:20:15
  • Go学习笔记之Zap日志的使用

    2023-09-19 01:21:36
  • python实现图像拼接

    2023-07-26 15:38:27
  • 深入研究WINDOW.EVENT对象

    2012-04-26 16:31:58
  • asp如何判断偶数和奇数?

    2010-01-12 20:16:00
  • 浅谈django框架集成swagger以及自定义参数问题

    2022-01-09 20:25:10
  • python爬虫的一个常见简单js反爬详解

    2022-10-26 11:46:27
  • python 布尔注入原理及渗透过程示例

    2022-11-21 01:04:21
  • Django使用channels + websocket打造在线聊天室

    2022-01-05 11:16:26
  • 教你轻松掌握常用的子句、关键词和函数

    2009-01-19 13:34:00
  • 跟老齐学Python之开始真正编程

    2021-06-26 21:42:22
  • python实现多线程的方式及多条命令并发执行

    2023-08-09 11:37:20
  • phpstorm断点调试方法图文详解

    2023-05-30 01:06:40
  • Python获取当前脚本文件夹(Script)的绝对路径方法代码

    2021-05-27 09:57:52
  • asp之家 网络编程 m.aspxhome.com