油画滤镜算法描述:

该算法有两个参数,一个是模板半径(radius),则模板尺寸是(radius * 2 + 1)*(radius * 2 + 1)大小(其实也可以偶数倍数无所谓的),也就是以当前像素为中心,向外扩展 radius 个像素的矩形区域作为一个搜索范围,我们暂时将它称为“模板”(实际上该算法并不是例如高斯模糊,自定滤镜那种标准模板法,仅仅是处理过程类似)。另一个参数是光滑度(smoothness),实际上他是灰度桶的个数。我们假设把像素的灰度/亮度( 0 ~ 255 )均匀的分成 n 个区间,则每个区间我们在此称它为一个桶(bucket),这样我们就有很多个桶,称之为桶列表(buckets)

(1)算法遍历图上的每个像素,针对当前位置 (x, y) 像素,将模板范围内的所有像素灰度化,即把图像变成灰度图像。

(2)把像素值进一步离散化,即根据像素的灰度落入的区间,把模板内的像素依次投入到相应的桶中

(3)从这些桶中找到一个落入像素个数最多的桶,并对该桶中的所有像素求出颜色平均值,作为位置 (x, y) 的结果值。文中使用桶阵列(8 个桶,即把0~255的灰度值离散化成 8 个区间段)。

import cv2
import numpy as npdef oilPainting(img, templateSize, bucketSize, step):#templateSize模板大小,bucketSize桶阵列,step模板滑动步长gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)gray = ((gray/256)*bucketSize).astype(int)                          #灰度图在桶中的所属分区h,w = img.shape[:2]oilImg = np.zeros(img.shape, np.uint8)                              #用来存放过滤图像for i in range(0,h,step):top = i-templateSizebottom = i+templateSize+1if top < 0:top = 0if bottom >= h:bottom = h-1for j in range(0,w,step):left = j-templateSizeright = j+templateSize+1if left < 0:left = 0if right >= w:right = w-1# 灰度等级统计buckets = np.zeros(bucketSize,np.uint8)                     #桶阵列,统计在各个桶中的灰度个数bucketsMean = [0,0,0]                                       #对像素最多的桶,求其桶中所有像素的三通道颜色均值#对模板进行遍历for c in range(top,bottom):for r in range(left,right):buckets[gray[c,r]] += 1                         #模板内的像素依次投入到相应的桶中,有点像灰度直方图maxBucket = np.max(buckets)                                 #找出像素最多的桶以及它的索引maxBucketIndex = np.argmax(buckets)for c in range(top,bottom):for r in range(left,right):if gray[c,r] == maxBucketIndex:bucketsMean += img[c,r]bucketsMean = (bucketsMean/maxBucket).astype(int)           #三通道颜色均值# 油画图for m in range(step):for n in range(step):oilImg[m+i,n+j] = (bucketsMean[0],bucketsMean[1],bucketsMean[2])return  oilImgimg = cv2.imread(r'C:\Users\x\Desktop\92.jpg', cv2.IMREAD_ANYCOLOR)
oil = oilPainting(img,4,8,2)
cv2.imshow('youhua',oil)
cv2.imwrite(r'C:\Users\x\Desktop\97.jpg',oil)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里templateSize模板大小就是矩形模板的宽,步长step可选择1,2,3等,1图片最为细致但是速度过慢,2速度快效果也不错,3速度最快但是图片成斑状。

结果:


你可以通过图像平滑来处理图片。

然后用一张油画纹理图片,通过图层混和算法来处理图片。

灵感来自这个博主:Matrix_11和风吹夏天

PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)

下列公式中,A代表了上面图层像素的色彩值(A=像素值/255),B代表下面图层像素的色彩值(B=像素值/255),C代表了混合像素的色彩值(真实的结果像素值应该为255*C)。该公式也应用于层蒙板。

不透明度模式:

C=d*A+(1-d)*B

相对于不透明度而言,其反义就是透明度。这两个术语之间的关系就类似于正负之间的关系:100%的不透明度就是0%的透明度。该混合模式相对来说比较简单,在该混合模式下,如果两个图层的叠放顺序不一样,其结果也是不一样的(当然50%透明除外)。该公式中,A代表了上面图层像素的色彩值(A=像素值/255),d表示该层的透明度,B代表下面图层像素的色彩值(B=像素值/255),C代表了混合像素的色彩值(真实的结果像素值应该为255*C)。该公式也应用于层蒙板,在这种情况下,d代表了蒙板图层中给定位置像素的亮度,下同,不再叙述。

正片叠底模式:

C=A*B

将两个颜色的像素值相乘,然后除以255得到的结果就是最终色的像素值。通常执行正片叠底模式后的颜色比原来两种颜色都深。任何颜色和黑色正片叠底得到的任然是黑色,任何颜色和白色执行正片叠底则保持原来的颜色不变,而与其他颜色执行此模式会产生暗室中以此种颜色照明的效果。像素点的像素值是0-255,黑色值是0,白色是255.

该效果将两层像素的标准色彩值(基于0..1之间)相乘后输出,其效果可以形容成:两个幻灯片叠加在一起然后放映,透射光需要分别通过这两个幻灯片,从而被削弱了两次。

颜色加深模式:

C=1-(1-B)/A

查看每个通道的颜色信息,通过增加“对比度”使底色的颜色变暗来反映绘图色,和白色混合没变化。

该模式和上一个模式刚好相反。如果上层越暗,则下层获取的光越少,如果上层为全黑色,则下层越黑,如果上层为全白色,则根本不会影响下层。结果最亮的地方不会高于下层的像素值。

颜色减淡模式:

C=B/(1-A)

查看每个通道的颜色信息,通过降低“对比度”使底色的颜色变亮来反映绘图色,和黑色混合没变化。

该模式下,上层的亮度决定了下层的暴露程度。如果上层越亮,下层获取的光越多,也就是越亮。如果上层是纯黑色,也就是没有亮度,则根本不会影响下层。如果上层是纯白色,则下层除了像素为255的地方暴露外,其他地方全部为白色(也就是255,不暴露)。结果最黑的地方不会低于下层的像素值。

import cv2img = cv2.imread(r'C:\Users\x\Desktop\97.jpg',cv2.IMREAD_ANYCOLOR)
img1 = cv2.imread(r'C:\Users\x\Desktop\57.jpg',cv2.IMREAD_ANYCOLOR)
img2 = cv2.resize(img1, (658,986), interpolation=cv2.INTER_CUBIC)
d = 0.84
img3 = d*(img/255)+(1-d)*(img2/255)
img4 = img3*255
#cv2.imshow('youhua',img3)
cv2.imwrite(r'C:\Users\x\Desktop\101.jpg',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

待续。。。。。

Python-OpenCV-PS油画滤镜效果相关推荐

  1. Python OpenCV浅析3种滤镜效果

    Python OpenCV浅析3种滤镜效果 前言 浮雕滤镜效果 雕刻滤镜效果 凸透镜滤镜效果

  2. OpenCV~PS效果

    Python-OpenCV-PS油画滤镜效果 opencv 照片动漫风格 实验1:图像的手绘效果

  3. Python + OpenCV 太好玩了,可惜你可能还不会

    这些年,你可能看过很多这样的新闻: "用 Python + OpenCV 把照片变成油画--" "Python + OpenCV 实现自动扫雷,挑战世界记录--" ...

  4. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  5. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  6. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  7. 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化

    一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...

  8. python+opencv多进程实现识别魔方颜色,通过kociemba算法得出算法字符串并画图(附毕设完整视频)

    完整毕设成果视频如下: 本科毕业设计转魔方(声音略大) python+opencv本科毕业设计转魔方(声音略大) 上一篇博客已经给大家讲了鼠标hsv获取魔方颜色阈值方法,具体见 python+open ...

  9. Python OpenCV 边缘滤波保留(EPF)

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 函数原型介绍 高斯双边滤波 均值迁移滤波 橡皮擦的小节 基础知识铺垫 前几篇博客 ...

  10. python+opencv实现人脸微整形

    目录 一.前言 二.主要原理 三.算法实现 (1)计算偏移量 (2)考虑多个点影响 (3)控制点的手动增加,删除功能 四.总结 一.前言 表情捕捉驱动另一张脸或者3D人脸是元宇宙一项比较热门的技术,目 ...

最新文章

  1. 在实践中深入理解IP协议
  2. jQuery学习总结之基础知识----持续更新中
  3. MySQL内部开发人员如何看待MySQL组复制?
  4. ArcGIS Server 10.1动态图层 以及Windows Phone/Silverlight客户端实现
  5. android项目允许命令,android 项目 gradle 命令
  6. JQUERY获取DOM
  7. 加密选项_视频会议Zoom 5.0版本重大更新,增强加密功能提供更多安全选项
  8. 《SpringBoot从菜鸟到老鸟》之SpringBoot 如何配置全局的异常捕获
  9. 【渝粤题库】陕西师范大学200341实变函数作业(高起本、专升本)
  10. linux mysql备份大量数据库,linux备份整个mysql数据库
  11. ARM CORTEX-M0 权威指南 英文
  12. 字符集及其存储方式(解决乱码问题)
  13. flask常用内容:
  14. 基于TortoiseGit完成本地代码上传Git远程仓库中
  15. CentOS7安装搜狗输入法
  16. 智慧环境应急平台建设方案
  17. messenger支持查找附近的人功能吗_玩微信,附近的人,是否双方都在查找附近的人,才能显示?...
  18. Nano配置永久静态IP
  19. MyBatis常见问题
  20. python sort多条件排序

热门文章

  1. 北林信息学院计算机导师名单,北京林业大学信息学院计算机应用技术导师介绍:刘文萍...
  2. C语言基础(十三)系统错误信息
  3. matlab gazebo,ROS与Matlab语言入门教程-从Gazebo读取模型和仿真性能
  4. 2021正睿noip十连day2
  5. Assuming drive cache: write through,可能不是错误信息,只是提示信息
  6. Docker六大优势,云中部署模式、以及视频demo
  7. Cookie.js 源码解析
  8. 1.Btn、Div特效---利用border
  9. oracle中sql关键字,Oracle常用的sql语句
  10. 近9分的生信杂志发了一篇Venn图工具大比拼