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

news2024/10/3 4:44:18

文章目录

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


前言

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)  #将文件名添加到imagelist
        print(filename)
        filter(r'in',filename)  # 为图片应用灰度滤镜

在这里插入图片描述

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

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

代码如下(示例):

# 对图片进行二值化======================================================
import cv2
import numpy as np

img1 = 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 np

original_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 np

def callback(object):
    pass

cv2.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')/100
    img3 = 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_rgb
    for _ 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)  #将文件名添加到imagelist
        print(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)  #将文件名添加到imagelist
        print(filename)
        filter(r'in',filename)  # 为图片应用卡通动漫滤镜

在这里插入图片描述


总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由Geoscene Enterprise 2.1 升级至Geoscene Enterprise 3.1

文章目录一、升级前工作二、升级Geoscene portal三、升级Web Adaptor(针对portal门户)四、升级Server 站点(作为门户托管服务器)五、升级Web Adaptor(针对server)六、升级Data Store需求:由GeoS…

bestSync外网转内网操作

一.外网笔记本操作 设置管理员密码打开笔记本电脑,设置管理员密码(如果已经设置了的,请忽略该操作):左下角鼠标左键点击->控制面板->用户帐户和家庭安全->用户帐户->密码,密码设置完成后回到桌…

【Acwing 周赛复盘】第90场周赛复盘(2023.2.11)

【Acwing 周赛复盘】第90场周赛复盘(2023.2.11) 周赛复盘 ✍️ 本周个人排名:1488/2884 AC情况:1/3 这是博主参加的第五次周赛,这次做题的时候,感觉题目好难 😂 但是一听y总讲解,又…

ORA error集锦

1、oralce 数据客户端需要安装的问题 保存信息为: “无法连接到数据库,因为数据库客户端软件无法加载。确保已正确安装并配置数据库客户端软件” 从百度网盘下载,并安装win32 oracle client 安装包 2、ORA错误 “执行异常,ORA-00911: inval…

TCP四次挥手

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

Revit标注问题:尺寸界线长度和“快速尺寸定位标注”

一、 Revit中关于标注的问题 1.有时候,但我们建完模型要进行一定的标注,往往会出现这样的间题,如图1所示 按照正常的标注来说,通常它的标注的正确方式应该是这样的,尺寸界线长度应该是指向图元的,如图2所示…

【源码系列】Faster RCNN源码详解(一)——transform

系列文章目录 文章目录系列文章目录前言一、transform二、总结1.标准化2.缩放3.batch前言 Faster RCNN的源码整体可以分为7个模块,每个模块负责不同的功能。推荐B站up霹雳吧啦Wz讲解的Faster RCNN源码,已经很详细了,这里只是个人的一些理解总…

【Unity VR开发】结合VRTK4.0:创建滑块

语录: 只有经历地狱般的磨练,才能炼出创造天堂的力量。 前言: 滑块是一个非常简单的控件,它允许通过沿有限的驱动轴滑动 Interactable 来选择不同的值。我们将使用线性驱动器创建一个滑块控件,该控件允许我们根据与滑…

蓝桥杯刷题五

1.01背包问题这题就是01背包问题的模板题 回顾一下01背包 01就是这个东西选和不选01背包的表达式是f[i]max(f[i-v]w,f[i]);那么这题就可以直接做了 值得注意的是这里只用了一维数组 所以更新的时候要从后往前面更新#include <bits/stdc.h> using namespace std; const in…

【JDK8新特性之Stream流-Stream结果收集案例实操】

一.JDK8新特性之Stream流-Stream结果收集以及案例实操 二.Stream结果收集(collect函数)-实例实操 2.1 结果收集到集合中 /*** Stream将结果收集到集合中以及具体的实现 collect*/Testpublic void test01(){// 收集到List中 接口List<Integer> list Stream.of(1, 2, 3…

码住!新手容易上手的5个tiktok数据分析网站

当下短视频已经称霸了各大内容平台&#xff0c;越来越多的创作者进入到短视频赛道&#xff0c;为了更好地运营自己的内容平台&#xff0c;数据分析是必不可少的。很多人都入局了tiktok&#xff0c;对于商家或者博主红人来说&#xff0c;这是比较新平台&#xff0c;希望能在这个…

Spring Cloud Gateway的使用

Spring Cloud Gateway网关Spring Cloud Gateway三大核心概念Route(路由)Predicate(断言)Filter(过滤)开始使用动态路由配置路由断言过滤器实现TokenIP验证拦截Spring Cloud Gateway 网关&#xff1a;微服务中最边缘的服务&#xff0c;用来做用户和微服务的桥梁 没有网关❓&…

Python使用VTK对容积超声图像进行体绘制(三维重建)

目录VTK简介什么是体绘制&#xff1f;体绘制效果图流程CodeQ&AReferenceVTK简介 VTK&#xff08;Visualization Toolkit&#xff09;是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具&#xff0c;可以让用户创建和处理复杂的3D图形和数据可视…

论文投稿指南——中文核心期刊推荐(音乐)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

超纯水制备,MB-106UP抛光树脂的技术解析

超纯水&#xff08;Ultrapure water&#xff09;又称UP水&#xff0c;是指电阻率达到18 MΩ*cm&#xff08;25℃&#xff09;的水。这种水中除了水分子外&#xff0c;几乎没有什么杂质&#xff0c;更没有细菌、病毒、含氯二噁英等有机物&#xff0c;当然也没有人体所需的矿物质…

低代码是什么意思?企业为什么要用低代码平台?

低代码是什么意思&#xff1f;企业为什么要用低代码平台&#xff1f; 这两个问题似乎困扰了很多人&#xff0c;总有粉丝跟小简抱怨&#xff0c;一天到晚念叨低代码&#xff0c;倒是来个人解释清楚啊&#xff01; 来了&#xff0c;这次一文让你全明白。 先解释这几个名词&…

mysql5.7.39数据库服务搭建(win10)

mysql下载下载地址&#xff1a;https://downloads.mysql.com/archives/community如上图&#xff0c;选择了mysql 5.7.39版本&#xff0c;64位Windows操作系统&#xff1b;然后下载ZIP Archive格式的安装文件&#xff0c;点击“Download” 按钮即可。下载好后&#xff0c;进行解…

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…

win11右键新建菜单添加选项

需要操作 2 处注册表&#xff0c; 以下以在右键新建菜单中添加 .html 为例 在主键 HKEY_CLASSES_ROOT 中&#xff0c;搜索 .html 找到后 &#xff0c;右键点击它&#xff0c;选 新建 ->项&#xff0c; 在这里插入图片描述 项目名字是&#xff1a;ShellNew 新建后&#x…

【Linux学习笔记】4.Linux 文件基本属性及文件与目录管理

前言 本章介绍Linux的文件基本属性和文件与目录管理。 Linux 文件基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录…