python学习之OpenCV-Python模块的部分应用示例(生成素描图和动漫图)

news/2024/4/20 7:31:09/文章来源:https://blog.csdn.net/u014740628/article/details/129200073

文章目录

  • 前言
  • 一、图片转灰度
  • 二、对图片进行二值化处理
  • 三、对图片去除噪点
  • 四、调整图片透明度
  • 五、生成素描滤镜效果图(方法结合应用)
  • 六、生成动漫卡通滤镜效果图(方法结合应用)
  • 总结


前言

OpenCV 是一个图像和视频处理库,具有 C++、C、Python 和 Java 中的绑定。OpenCV用于各种图像和视频分析,如面部识别和检测,车牌读取,照片编辑,高级机器人视觉,光学字符识别等等。

OpenCV-Python 是一个 Python 绑定库,旨在解决计算机视觉问题。

Python 是一种由 Guido van Rossum 开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使程序员能够用更少的代码表达思想,而不会降低可读性。

与 C/C++ 这类语言相比,Python 的速度更慢。好在,可以使用 C/C++ 轻松的拓展 Python ,我们可以在 C/C++ 中编写计算密集型代码,并用 Python 来封装。这给我们带来了两个好处:首先,代码像原始的 C/C++ 代码一样快(因为后台实际上就是 C/C++ 代码在工作),其次,在 Python 中编写代码比在 C/C++ 中更容易。OpenCV-Python 就是 OpenCV C++ 的 Python 封装。

OpenCV-Python 使用了 Numpy,这是一个有着 MATLAB 风格语法,高度优化的用于数值计算的库。所有 OpenCV 数组结构都与 Numpy 数组进行转换。这也使得与使用 Numpy 的其他库(如 SciPy 和 Matplotlib)集成更容易。


在这里插入图片描述

一、图片转灰度

什么叫图片的灰度化呢?其实很简单,就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B(就是红色变量的值,绿色变量的值,和蓝色变量的值,这三个值相等,“=”的意思不是程序语言中的赋值,是数学中的相等),此时的这个值叫做灰度值。

代码如下(示例):

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库'''
def filter(filein,picture_name):imgI_filename = os.path.join(filein,picture_name) # 源文件路径imgO_filename = os.path.join(r'out', picture_name)  # 目标文件路径img_rgb = cv2.imread(imgI_filename)  # 读取源图片img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) # 转换为灰度# 调整亮度和对比度res = np.uint8(np.clip((1.2 * img_gray + 0), 0, 255))cv2.imwrite(imgO_filename, res)    # 保存转换后的图片## cv2.imshow('GrayImage',img_cartoon)  # 加预览if __name__ == '__main__':imagelist = [] # 创建空列表#循环读取指定路径下的文件名for filename in os.listdir(r'in/'):imagelist.append(filename)  #将文件名添加到imagelistprint(filename)filter(r'in',filename)  # 为图片应用灰度滤镜

在这里插入图片描述

二、对图片进行二值化处理

什么叫图像的二值化?二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果。在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的灰度值范围是0或者255。

代码如下(示例):

# 对图片进行二值化======================================================
import cv2
import numpy as npimg1 = cv2.imread('01.jpg')
img2 = cv2.imread('02.jpg')
rows, cols, channels = img1.shape
roi = img2[0:rows, 0:cols]
img2gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, Mask = cv2.threshold(img2gray, 170, 255, cv2.THRESH_BINARY)
Mask_inv = cv2.bitwise_not(Mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=Mask)
img1_fg = cv2.bitwise_and(img1, img1, mask=Mask_inv)
dst = cv2.add(img1_bg, img1_fg)
img2[0:rows, 0:cols] = dst
cv2.imshow('res', Mask)
cv2.imshow('das', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

三、对图片去除噪点

实现原理:是在于先将噪点调亮以后再减少它的细节,总之就是让噪点“沉”下去。
代码如下(示例):

import cv2
import numpy as nporiginal_image1 = cv2.imread('in/01.jpg').astype(np.float32)/255# 设置调整颜色参数,小于1时,数值越小,越具有美白效果。反之,大于1时数值越大,可对美白照片还原原色
gamma1 = 0.6
whitening = np.power(original_image1, gamma1)# 去除噪点
denoise = cv2.medianBlur(whitening, 5)cv2.imshow('original_image', original_image1)
cv2.imshow('whitening', whitening)
cv2.imshow('denoise', denoise)

在这里插入图片描述

四、调整图片透明度

实现原理:需要在RGB三个通道的基础上添加alpha通道信息(alpha通道)。
代码如下(示例):

# 实时调整图片透明度
import cv2
import numpy as npdef callback(object):passcv2.namedWindow('image')
img1 = cv2.imread('01.jpg')
[x, y, z] = img1.shape
# 创建一个相同规格的图像,可以自己读取一张图用切片工具
# 选出相同大小的矩阵
img2 = np.zeros([x, y, z], img1.dtype)
B, G, R = 10, 88, 21  # 自己调色
img2[:, :, 0] = np.uint8(B)
img2[:, :, 1] = np.uint8(G)
img2[:, :, 2] = np.uint8(R)
cv2.createTrackbar('alpha', 'image', 0, 100, callback)while True:Alpha = cv2.getTrackbarPos('alpha', 'image')/100img3 = cv2.addWeighted(img1, Alpha, img2, 1-Alpha, 0)cv2.imshow('image', img3)if cv2.waitKey(10) & 0xFF == ord('q'):break
cv2.destroyAllWindows()

在这里插入图片描述

五、生成素描滤镜效果图(方法结合应用)

代码如下(示例):

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库def filter(filein,picture_name):imgI_filename = os.path.join(filein,picture_name) # 源文件路径imgO_filename = os.path.join(r'out', picture_name)  # 目标文件路径img_rgb = cv2.imread(imgI_filename)  # 读取源图片num_down = 2   # 缩减像素采样的数目num_bilateral = 9 # 定义双边滤波的数目# 用高斯金字塔降低取样img_color = img_rgbfor _ in range(num_down):img_color = cv2.pyrDown(img_color)# 重复使用小的双边滤波代替一个大的滤波for _ in range(num_bilateral):img_color = cv2.bilateralFilter(img_color,d=4,sigmaColor=8,sigmaSpace=4)# 升采样图片到原始大小for _ in range(num_down):img_color = cv2.pyrUp(img_color)img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)  # 转换为灰度img_blur = cv2.medianBlur(img_gray, 19)  # 增加模糊效果。值越大越模糊(取奇数)# 检测到边缘并且增强其效果img_edge = cv2.adaptiveThreshold(img_blur,256,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,blockSize=9,C=2)img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) # 彩色图像转为灰度图像cv2.imwrite(imgO_filename, img_edge) # 保存图片if __name__ == '__main__':imagelist = [] # 创建空列表#循环读取指定路径下的文件名for filename in os.listdir(r'in/'):imagelist.append(filename)  #将文件名添加到imagelistprint(filename)filter(r'in',filename)  # 为图片应用写生素描滤镜

在这里插入图片描述

六、生成动漫卡通滤镜效果图(方法结合应用)

代码如下(示例):

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库def filter(filein,picture_name):imgI_filename = os.path.join(filein,picture_name) # 源文件路径imgO_filename = os.path.join(r'out', picture_name)  # 目标文件路径img_rgb = cv2.imread(imgI_filename)  # 读取图片# 转换为灰度并且使其产生中等的模糊img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)img_blur = cv2.medianBlur(img_gray, 5)  # 值越大越模糊(取奇数)#检测到边缘并且增强其效果img_edge = cv2.adaptiveThreshold(img_blur,128,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,blockSize=9,C=8)img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) #彩色图像转为灰度图像img_cartoon = cv2.bitwise_and(img_rgb, img_edge)  # 灰度图像转为彩色图像# 调整亮度和对比度res = np.uint8(np.clip((2.0 * img_cartoon + 16), 0, 255))# 保存转换后的图片cv2.imwrite(imgO_filename, res)if __name__ == '__main__':imagelist = [] # 创建空列表#循环读取指定路径下的文件名for filename in os.listdir(r'in/'):imagelist.append(filename)  #将文件名添加到imagelistprint(filename)filter(r'in',filename)  # 为图片应用卡通动漫滤镜

在这里插入图片描述


总结

到此这篇关于python学习之OpenCV-Python模块的部分应用示例的文章就介绍到这了,更多相关python学习内容浏览下面的相关文章,希望大家以后多多支持!

历史文章地址:
python和C++代码实现图片九宫格切图程序(附VS2015配置Opencv教程)
python和C++代码实现模拟动态指针时钟
python学习之10行代码制作炫酷的词云图(匹配指定图形形状)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73822.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握饮食健康:了解你的宏量营养素摄入

谷禾健康 // 俗话说“病从口入”,我们的健康状况很大一部分取决于饮食。而食物基本上是由各种营养素构成的。 宏量营养素是人体大量需要的必需营养成分。宏量营养素指的是“三大”营养素:蛋白质、脂肪和碳水化合物,它们是我们饮食中的关键。 …

【JavaScript】基本语法大全

前言: 大家好,我是程序猿爱打拳。在学习C和Java这样的后端编程语言后,我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同,因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

【华为OD机试模拟题】用 C++ 实现 - 最低位排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

Eth-trunk :LACP模式链路聚合实战

Eth-trunk : LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 ,网段为192.168.10.0 /24PC2和PC4数据vlan20 ,网段为192.168.20.0 /24确保设备之间互联互通,使用最大互联带宽并没有环路确保相同网段的PC可以互通判断交换机之间的每个端口…

ros下用kinectv2运行orbslam2

目录 前提 创建工作空间 orbslam2源码配置、测试: 配置usb_cam ROS功能包 配置kinect 前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 创建工作空间 我们在主目录下创建一个catkin_…

Node 10.0.8.6:9003 is unknown to cluster

解决方案解决方案一解决方案一 ① 概念介绍 公网ip:就是任意两台连接了互联网的电脑可以互相ping ip,能够通的ip 内网ip:只是在内网中使用无法与外网连接的ip ②问题背景 在腾讯云上搭建的一个redis集群,集群启动后 可以看到启动节点…

TX Text Control .NET Server for ASP.NET 31.0 SP2 CRK

用于 ASP.NET 31.0 SP2 的 TX 文本控件 .NET 服务器 用于 ASP.NET 的 TX 文本控件 .NET 服务器 TX Text Control Server for ASP.NET 是用于 Web 应用程序或服务的服务器端组件。它是一个完全可编程的 ASP.NET 文字处理器引擎,提供了广泛的文字处理功能。使用 TX Te…

C++中的内存管理

文章目录前言1.C中内存空间的划分2.C内存管理方式1.对内置类型的处理2.对自定义类型的处理3.new和delete实现原理4.定位new3.总结1. malloc/free和new/delete的区别2. 内存泄漏前言 C中的内存空间划分和C语言是很像的,基本上区别不大。但是因C中,引入了…

davis2016评估教程

DAVIS 2016是VOS任务中的一个经典的benchmark,但是一些VOT的算法有时候也可以预测mask,所以也会在上面测一测性能,本次就随手记录一下自己评测的过程,有需要的小伙伴可以往下看。 DAVIS 2016数据集官方项目网站:https:…

TCP四次挥手

TCP 四次挥手过程是怎样的? TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图: 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1…

node报错

记录bug:运行 npx -p storybook/cli sb init 时报错gyp info spawn C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exegyp info spawn args [gyp info spawn args build/binding.sln,gyp info spawn args /nologo,gyp info spawn args…

prometheus + alterManager + 飞书通知,实现服务宕机监控告警;实测可用

架构设计图 最终效果图 项目准备 xml依赖 <!-- 监控相关 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>io.…

消息队列--Kafka

Kafka简介集群部署配置Kafka测试Kafka1.Kafka简介 数据缓冲队列。同时提高了可扩展性。具有峰值处理能力&#xff0c;使用消息队列能够使关键组件顶住突发的访问压力&#xff0c;而不会因为突发的超负荷的请求而完全崩溃。 Kafka是一个分布式、支持分区的&#xff08;partition…

JAVA 8 新特性 Lamdba表达式

Java8 新特性&#xff1a; 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API 7、Optional 8、其他特性 Java8 优势&#xff1a;速度快、代码更少&#xff08;增加了新的语法 Lambda 表达式&#xff09;、强…

Android 架构 MVC MVP MVVM,这一波你应该了然于心

MVC&#xff0c;MVP和MVVM是软件比较常用的三种软件架构&#xff0c;这三种架构的目的都是分离&#xff0c;避免将过多的逻辑全部堆积在一个类中。在Android中&#xff0c;Activity中既有UI的相关处理逻辑&#xff0c;又有数据获取逻辑&#xff0c;从而导致Activity逻辑复杂不单…

Wireshark抓包

Wireshark 1 抓包时间显示格式 2 界面显示列设置 3 protocol协议解析 4 过滤器 tcp.port&#xff1a;TCP端口tcp.dstport&#xff1a;TCP目的端口tcp.srcport&#xff1a;TCP源端口udp.port&#xff1a;UDP端口udp.dstport&#xff1a;UDP目的端口udp.srcport&#xff1a;UDP…

月薪过3W的软件测试工程师,都是怎么做到的?

对任何职业而言&#xff0c;薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&#xff0c;我说的是最基础的功能测试的岗位…

良许也成为砖家啦~

大家好&#xff0c;我是良许。 没错&#xff0c;良许成为砖家啦&#xff0c;绝不是口嗨&#xff0c;有图有真相&#xff01; 有人会说&#xff0c;咦&#xff0c;这明明是严宇啊&#xff0c;跟你良许有啥关系&#xff1f; 额。。老读者应该知道良许的来历—— 鄙人真名严宇&a…

Python-datetime、time包常用功能汇总

目录基础知识时间格式有哪些&#xff1f;Python中的时间格式化时间戳datetimedatedatetimetimedeltatime常用获取今天凌晨字符串&#xff1f;将一个时间格式的字符串转为时间戳将一个时间戳转为指定格式的字符串全部代码参考基础知识 时间格式有哪些&#xff1f; 「格林威治标…

最新OpenMVG编译安装与逐命令运行增量式和全局式SfM教程

openmvg是一个轻便的可以逐步运行的SfM开源库&#xff0c;它同时实现了增量式和全局式两种算法。 说明文档地址&#xff1a;https://openmvg.readthedocs.io/en/latest/ github主页地址&#xff1a;https://github.com/openMVG/openMVG 1 编译安装 openmvg的安装比较简单&…