Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之三 简单卡通漫画风格效果

一、简单介绍

二、简单卡通漫画风格效果实现原理

A、边缘蒙版的处理说明:

B、减少原图色调说明

C、缘蒙版与经过颜色处理的图像相结合说明

三、简单卡通漫画风格效果案例实现简单步骤


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单卡通漫画风格效果实现原理

漫画风格的效果通常体现在图像的轮廓、颜色和纹理上。

实现漫画风格效果的关键在于突出图像的轮廓,并增强图像的色彩和纹理,使得图像看起来更像是手绘的漫画。

设计思路如下:

(1)将彩色图像转换成灰度图像。

(2)边缘检测提取灰度图像的边缘。

(3)对于检测的边缘进行增强并二值化产生粗线条的特征图像。

(4)将处理完的图像与原图进行叠加,得到最终效果。

可能涉及的算法:

  1. 边缘检测: 使用边缘检测算法检测图像中的边缘。常用的边缘检测算法包括 Sobel 算子、Canny 边缘检测算法等。这些算法可以提取图像中的边缘信息,并将边缘信息表示为明暗不同的像素值。

  2. 轮廓增强: 对检测到的边缘进行增强,使得图像中的轮廓更加清晰和突出。可以采用增强对比度、二值化等方法来实现。例如,可以通过增强边缘处的对比度或者二值化边缘图像来突出图像的轮廓。

  3. 颜色增强: 增强图像的色彩,使得图像看起来更加丰富和鲜艳。可以采用调整色相、饱和度和亮度等方法来实现。例如,可以使用直方图均衡化或者颜色映射等技术来增强图像的色彩。

  4. 纹理增强: 增强图像的纹理,使得图像看起来更加生动和有趣。可以采用图像滤波或者纹理合成等方法来实现。例如,可以使用高斯滤波或者双边滤波来平滑图像的纹理,从而减少噪声并增强细节。

A、边缘蒙版的处理说明:

常见的卡通效果强调图像中边缘的厚度。可以通过cv2.adaptiveThreshold() 函数来检测图像中的边缘。可以将egde_mask函数定义为:

def edge_mask(img, line_size, blur_value):
    """
    创建边缘蒙版
    :param img:
    :param line_size:
    :param blur_value:
    :return:
    """
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray_blur = cv2.medianBlur(gray, blur_value)
    edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)
    return edges

在该函数中,将图像转换成灰度图像,然后使用cv2.medianBlur来减少模糊的灰度图像的噪点。模糊值越大,意味着图像中出现的黑色噪点越少。

接着,应用adaptiveThreshold函数,定义边缘的线条粗细。线条越粗,意味着图像中强调的边缘越厚。

cv2.adaptiveThreshold() 是 OpenCV 中的一个函数,用于对给定的图像执行自适应阈值处理。阈值处理是一种常用的图像处理技术,用于将图像分割成两个区域,通常是将感兴趣的物体与背景分开。在阈值处理中,像素值与阈值进行比较,如果超过阈值,则被赋予一定的值,否则被赋予另一个值。

在自适应阈值处理中,阈值值不是固定的,而是根据每个像素附近的图像特征局部变化。这可以更好地处理图像中的光照、对比度和噪声等变化。

cv2.adaptiveThreshold() 函数有以下参数:

    (1) src:输入图像。
    (2) maxValue:像素超过阈值时要赋的最大值。通常设置为 255。
    (3) adaptiveMethod:自适应阈值处理算法。有两个选项:         cv2.ADAPTIVE_THRESH_MEAN_C 和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C。

        前者将局部邻域内像素值的平均值作为阈值,

        后者将局部邻域内像素值的加权和作为阈值。
    (4) thresholdType:阈值处理类型。

        有两个选项:cv2.THRESH_BINARY 和 cv2.THRESH_BINARY_INV。

        前者将超过阈值的像素赋为 maxValue,低于阈值的像素赋为 0,

        后者则相反。
    (5) blockSize:用于计算阈值的局部邻域的大小。这应该是一个奇数,通常设置为 3、5、7 等。
    (6) C:在计算阈值时从像素值的平均值或加权和中减去的常数值。这可以帮助调整阈值处理的敏感度。

B、减少原图色调说明

在颜色方面,照片和素描的主要区别是它们各自的颜色数量。素描的颜色比照片少。因此,使用颜色量化来减少照片中的颜色数量。

要进行颜色量化,应用OpenCV库提供的K均值聚类算法。为了在接下来的步骤中使用更方便,可以定义color_quantization函数如下:

def color_quantization(img, k):
    """
    减少图片色调
    :param img:
    :param k: 调整k值来确定想要应用到图像的颜色数量
    :return:
    """
    # Transform the image
    data = np.float32(img).reshape((-1, 3))

    # Determine criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)

    # Implementing K-Means
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result

C、缘蒙版与经过颜色处理的图像相结合说明

把之前的边缘蒙版与经过颜色处理的图像相结合。做到这一点,需要使用cv2.bitwise_and函数。

def img_and(blurred, edges):
    """
    将边缘蒙版与经过颜色处理的图像相结合
    :param blurred:
    :param edges:
    :return:
    """
    cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
    return cartoon

cv2.bitwise_and() 是 OpenCV 中的位运算函数之一,用于对两幅二值图像进行按位“与”操作。具体来说,对于每个像素,将两幅输入图像相应位置的像素值分别进行按位“与”运算,输出的结果图像的对应像素值即为这两幅输入图像对应像素值的按位与结果。

dst = cv2.bitwise_and(src1, src2[, mask])

三、简单卡通漫画风格效果案例实现简单步骤

1、编写代码

2、运行结果

3、具体代码

"""
卡通漫画风格效果
    1)载入图像
    2)创建边缘蒙版
    3)减少调色板
    4)将边缘蒙版与经过颜色处理的图像结合起来

"""

import cv2
import numpy as np


def read_file(filename):
    """
    读取显示,并返回图片
    :param filename:
    :return:
    """
    img = cv2.imread(filename)
    # 设置窗口属性,并显示图片
    cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)
    cv2.imshow("Dog", img)
    return img


def edge_mask(img, line_size, blur_value):
    """
    创建边缘蒙版
    :param img:
    :param line_size:
    :param blur_value:
    :return:
    """
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray_blur = cv2.medianBlur(gray, blur_value)
    edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)
    return edges


def color_quantization(img, k):
    """
    减少图片色调
    :param img:
    :param k: 调整k值来确定想要应用到图像的颜色数量
    :return:
    """
    # Transform the image
    data = np.float32(img).reshape((-1, 3))

    # Determine criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)

    # Implementing K-Means
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result


def color_blur(img, d, sigmaColor, sigmaSpace):
    """
    图像简单模糊处理
    :param img:
    :param d:每个像素邻域的直径
    :param sigmaColor:该参数的值越大,表示半等色的区域越大
    :param sigmaSpace:该参数的值越大,意味着较远的像素只要其颜色足够接近,就会相互影响
    :return:
    """
    blurred = cv2.bilateralFilter(img, d=d, sigmaColor=sigmaColor, sigmaSpace=sigmaSpace)
    return blurred


def img_and(blurred, edges):
    """
    将边缘蒙版与经过颜色处理的图像相结合
    :param blurred:
    :param edges:
    :return:
    """
    cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
    return cartoon


def main():
    img = read_file("Images/DogFace.jpg")
    edge_img = edge_mask(img, 11, 7)
    color_img = color_quantization(img, 9)
    blurred_color_img = color_blur(color_img, 7, 7, 200)
    cartoon_effect = img_and(blurred_color_img, edge_img)

    # 设置窗口属性,并显示图片
    cv2.namedWindow("cartoon_effect", cv2.WINDOW_KEEPRATIO)
    cv2.imshow("cartoon_effect", cartoon_effect)

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

4、一些效果注意事项:

1)参数调整: 不同的图像可能需要不同的参数设置才能达到最佳的漫画效果。因此,在应用漫画效果之前,需要对算法中的参数进行适当的调整和优化。

2)效率问题: 漫画效果的实现可能会消耗较多的计算资源,特别是在处理大尺寸图像时。因此,在实现漫画效果时,需要考虑算法的效率和性能,尽量避免出现卡顿或者内存溢出等问题。

3)效果评估: 在实现漫画效果后,需要对生成的图像进行评估,确保达到了预期的效果。可以通过比较生成图像和原始图像的差异来评估漫画效果的好坏,并进行必要的调整和改进。

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

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

相关文章

FPGA控制AD7606_AD7606解读

目录 一、AD7606解读二、引脚说明三、时序图 一、AD7606解读 AD7606特点: 8通道同步采样模拟通道数为8分辨率:16bit,即最小采样的电压为5V/(2^16) 0,00007V,即数字量的1就代表模拟量的0,00007V,2代表0,00014V有效位数…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件,提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

linux之centos7vmware虚拟机的安装

目录 一、下载合适的vmware和操作系统镜像安装文件 来自引用文章的软件下载本片文章使用的软件下载 二、根据教程进行安装 三、网络配置解说 四、配置网络 编辑虚拟机网络 对VMWARE虚拟机网络进行配置 设置虚拟机网络为NAT模式 设置自定义网络为 VMnet8(NAT模式) 编辑li…

[ C++ ] STL---list的使用指南

目录 list简介 list的常用接口 构造函数 赋值运算符重载 迭代器 容量相关接口 元素访问接口 修改相关接口 头插push_front() 头删pop_front() 尾插push_back() 尾删pop_back() insert() erase() list的迭代器失效 list简介 1. list是可以以O(1)的时间复杂度在任意…

机器人现有力控技术检索

文章目录 力控技术1 基本柔顺力控1.1 直接力控1.2 间接力控1.2.1 被动和主动柔顺控制1.2.2 混合力位控制1.2.3 阻抗&导纳力控1.2.3.1 原理1.2.3.2 区别和联系1.2.3.3 工程应用 1.2.4 阻抗力控1.2.5 导纳力控 2 先进力控2.1 自适应力控2.2 鲁棒力控2.3 学习力控 3 智能力控3…

【LabVIEW FPGA入门】使用FPGA实现串行同步接口(SSI)

SSI(串行同步接口)是连接绝对位置传感器和控制器的广泛应用的串行接口。SSI利用控制器发出一个时钟脉冲序列,初始化传感器的门限输出。 传感器不断更新位置数据,并传送到移位寄存器中。在每一个时钟脉冲序列之间&#xff…

HTML_CSS学习:超链接、列表、表格、表格常用属性

一、超链接_唤起指定应用 1.相关代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>超链接_唤起指定应用</title> </head> <body><a href"tel:10010">电话联…

JavaScript初学心得

JavaScript JavaScript原名是livescript&#xff0c;是由美国网景开发的一种用于对网页操作的脚本语言 网页操作&#xff08;图片切换&#xff09; 脚本语言&#xff08;不需要编译 sql,html,css,javascript,由某种解释器直接可以运行&#xff09; livescript也是面向对象的…

基于Go的开源全栈测试工具RunnerGo使用详解

前言 测试人员目前广泛使用的测试工具如Postman、JMeter等&#xff0c;如Postman缺少对API的性能测试部分、JMeter则缺少测试报告和测试脚本的统一管理系统及UI测试功能&#xff0c;而RunnerGo的出现填补了传统测试工具的空缺&#xff0c;为测试人员提供了一个可以满足测试全流…

计算机毕业设计-基于Python的“哔哩哔哩视频网”视频热度分析

概要 在21世纪的今天&#xff0c;网络发展越来越快&#xff0c;网上的娱乐方式也越来越多样化&#xff0c;而如今在网上观看视频消遣时间越来越受到大众的青睐。Bilibili视频网站是现当下年轻人最受欢迎的一个视频网站。有调查显示&#xff0c;直到2019年的10月份&#xff0c;B…

基于python车辆故障管理系统的设计与实现flask-django-nodejs-php

网络发展前景无限&#xff0c;及早与网络结合&#xff0c;与信息时代同步&#xff0c;与高科技汇合&#xff0c;定会给社会各行各业的发展注入新鲜的活力。站在网络时代的前夜&#xff0c;我们清晰地听到了网络时代的宣言&#xff1a;谁掌握了网络&#xff0c;谁就掌握了未来。…

视觉信息处理和FPGA实现第5次作业-Matlab实现图像逆时针旋转90度

一、Matlab2022a安装 链接&#xff1a;https://pan.quark.cn/s/6e177bc7c11d 提取码&#xff1a;dKNN 二、Matlab使用 2.1 新建一个脚本文件&#xff08;.m文件&#xff09; 2.2 另存为到便于归档的地方 考虑到.m文件如果不是全英文路径&#xff0c;也有可能会出问题&#…

51单片机学习笔记7 串转并操作方法

51单片机学习笔记7 串转并操作方法 一、串转并操作简介二、74HC595介绍1. **功能**&#xff1a;2. **引脚**&#xff1a;3. **工作原理**&#xff1a;4. 开发板原理图&#xff08;1&#xff09;8*8 LED点阵&#xff1a;&#xff08;2&#xff09;74HC595 串转并&#xff1a; 三…

qt-pdf-viewer-library 编译过程记录

1.qtpdfviewerinitializer.h 中 类模板问题需要修改为下面代码: https://github.com/develtar/qt-pdf-viewer-library 下载代码&#xff1a; 编译出现错误 修改代码&#xff0c;如下: 2.无法触发onViewerLoaded 事件&#xff0c;就是界面无法显示PDF文件 修改下面代码&#…

在线播放视频网站源码系统 带完整的安装代码包以及搭建教程

在线播放视频网站源码系统的开发&#xff0c;源于对当前视频市场的深入洞察和用户需求的精准把握。随着视频内容的爆炸式增长&#xff0c;用户对视频播放的需求也日益多样化。他们希望能够随时随地观看自己感兴趣的视频内容&#xff0c;同时还希望能够在观看过程中享受到流畅、…

vue2 vue3 diff算法比较

目录 1&#xff1a;没key 补充1&#xff1a;为什么不建议用index作为key值&#xff1f; 2&#xff1a;有key 2.1&#xff1a;vue2diff 2.2&#xff1a;vue3diff 补充2&#xff1a;vue3的最长递增子序列 补充3&#xff1a;vue2diff和vue3diff的比较 补充4&#xff1a;虚…

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

推荐一个Java学习路线图

今天给大家推荐一个Java 学习路线, Java 要学的知识点、对应的学习资源和预计要花费的时间&#xff0c;都安排的明明白白的&#xff0c;不用再盲目的选了&#xff0c;有计划了&#xff0c;也别再迷茫和纠结了&#xff0c;就跟着学就行了。 1.1阶段一练气筑基--Java基础&#xf…

分布式砖题

雪花算法 变动位数&#xff0c;性能佳&#xff0c;灵活调整bit位划分&#xff0c;灵活 zk 临时节点和watch机制实现注册中心 &#xff0c;数据都在内存&#xff0c;nio 多线程模型&#xff1b; cp注重一致性&#xff0c;集群数据不一致时集群不可用 数据一致性模型 cap 强…

Nanya(南亚科技)DRAM芯片选型详解

一、DRAM产品选型 普通SDRAM只在时钟的上升期进行数据传输&#xff0c;DDR内存能够在时钟的上升期和下降期各传输一次数据&#xff0c;因此性能翻倍&#xff0c;被称为双倍速率同步动态随机存储器。因此DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR是一种掉…
最新文章