圖像處理:使用 OpenCV-Python 卡通化你的圖像(2)

在這里插入圖片描述

一、說明

在圖像處理領域,將圖像卡通化是一種新趨勢。人們使用不同的應用程序將他們的圖像轉換為卡通圖像。如今,玩弄圖像是許多人的愛好。人們通常會點擊圖片并添加濾鏡或使用不同的東西自定義圖像并將其發布到社交媒體上。但我們是程序員,我們做的不是普通人做的事。我們對將簡單的 RGB 圖像轉換為卡通圖像的過程更感興趣。在這個圖像處理部分中,我們將使用 OpenCV-Python 將圖像卡通化。

二、圖像到卡通的轉換

好吧,將圖像轉換為卡通更多的是關于圖像邊緣的檢測。如果你能很好地檢測圖像的邊緣,那么卡通效果將對該圖像更加有效。有許多算法可用于此,因此有多種方法可以做到這一點。我們將使用 OpenCV-Python 中的 BilateralFilter() 函數。

我通常在 Google Colab 中編寫和運行代碼。您可以在此處訪問 Google Colab 中的完整代碼。在這個項目中,我們將經歷以下主要步驟:

導入所需的庫
加載圖像
初始化要使用的參數
使用高斯金字塔的下采樣來減小圖像尺寸
迭代應用雙邊濾波器
使用上采樣將圖像放大到原始大小
使用中值濾波器模糊圖像
檢測并增強邊緣
將灰度邊緣圖像轉換回 RGB 彩色圖像
顯示圖像
我們必須完成這九個步驟才能獲得所需的輸出。那么,讓我們開始吧。

三、代碼實現

步驟1:庫導入

import cv2
import numpy as np
import matplotlib.pylab as plt
from google.colab.patches import cv2_imshow
from google.colab import files

第2步:圖像讀入

def read_file(filename):image = cv2.imread(filename)cv2_imshow(image)return image
uploaded = files.upload()
filename = next(iter(uploaded))
image = read_file(filename)

如果您正在使用 Google Colab,那么您可以寫下上述代碼。但如果您使用的是Jupyter 筆記本,那么只需添加要使用的圖像的路徑即可。兩者是同一件事。

步驟3:雙邊濾波

num_down = 2 
num_bilateral = 7 
w, h, _ = image.shape

初始化我們將要使用的參數。num_down 表示下采樣步驟的數量。num_bilateral 表示雙邊濾波步驟的數量。

步驟4:金字塔處理

img_color = np.copy(image) 
for _ in range(num_down): img_color = cv2.pyrDown(img_color)

這里我們縮小了圖片的尺寸。為了縮小尺寸,我們使用了高斯金字塔的下采樣操作。我們縮小圖片的尺寸是為了使后續操作更快。

步驟5:雙邊

for _ in range(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=9, sigmaColor=0.1, sigmaSpace=0.01)

這里sigmaColor表示顏色中的濾波器 sigma,sigmaSpace表示坐標空間。我們在這里迭代地應用具有較小直徑值的雙邊濾波器。參數d表示每個像素鄰域的直徑。

步驟6:

for _ in range(num_down):img_color = cv2.pyrUp(img_color)

為了將圖像放大到原始尺寸,我們在這里使用上采樣。

步驟7:

img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
img_blur = cv2.medianBlur(img_gray, 7)

我們將步驟 6 中的輸出圖像轉換為灰度,并使用稱為中值過濾器對圖像進行模糊處理。

步驟8:

img_edge = cv2.adaptiveThreshold((255*img_blur).astype(np.uint8),\
255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,\
blockSize=9,C=2)
正如我們上面所討論的,對圖像進行卡通化更多的是檢測圖像的邊緣。因此,在這一步中,我們將檢測和增強所用圖像的邊緣。

步驟9:

img_edge = cv2.cvtColor(img_edge,cv2.COLOR_GRAY2RGB) 
img_cartoon = cv2.bitwise_and(img_color,img_edge)

將灰度圖像轉換回 RGB 圖像,并與 RGB 圖像進行按位與運算以獲得最終輸出的卡通圖像。

步驟10:

fig = plt.figure(figsize=(20,10)) 
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05) 
plt.subplot(121) 
plt.imshow(image) 
plt.axis('off') 
plt.title('原始圖像??', size=20) 
plt.subplot(122) 
plt.imshow(img_cartoon) 
plt.axis('off') 
plt.title('卡通化圖像', size=20)
plt.顯示()

最后,顯示輸出。
在這里插入圖片描述

四、卡通圖像代碼背后的邏輯

在項目中,首先,我們必須去除圖像的弱邊緣,然后將圖像轉換為平面紋理,最后增強圖像的突出邊緣。為此,我們使用了 OpenCV-Python 中的bilateralFilter()、medianBlur()、adaptiveThreshold() 和 bitwise_and() 函數。

為了保持邊緣清晰、紋理光滑,我們使用了 OpenCV-Python 中的 BilateralFilter() 函數。更改 sigmaColor 和 sigmaSpace 的值,并查看圖像輸出的變化。

此外,對圖像進行下采樣以創建圖像金字塔。接下來,我們使用雙邊濾波器去除不重要的細節,然后使用后續的上采樣將圖像調整為原始大小。最后,為了使紋理平坦化,應用了中值模糊,然后用自適應閾值獲得的二值圖像掩蓋原始圖像,成功執行上述代碼后,您將看到輸出圖像。我嘗試使用小羅伯特·唐尼的圖像,得到了這個輸出圖像。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44895.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

后端老鳥的前端初探:心得與領悟20240713

🎉 后端老鳥的前端初探:心得與領悟 🚀 作為一名深耕后端多年的開發者,我最近踏上了前端探索的征程。這段跨界之旅讓我有了許多深刻的心得與領悟,現在我想和大家細細分享: 前端技術的飛速更新 &#x1f68…

godis源碼分析——Redis協議解析器

前言 redis這個目錄下的所有代碼就是為了一個事情,就是適配redis。 流程 redis下的基本流程 源碼 在redis/client/client.go 主要是客戶端處理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

Docker安裝RabbitMQ(帶web管理端)

1.拉取帶web管理的鏡像 可以拉取rabbitmq對應版本的web管理端,比如:rabbitmq:3.9.11-management,也可以直接拉取帶web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意:如果docker pull ra…

sqlalchemy使用with_entities返回指定數據列

sqlalchemy使用with_entities返回指定數據列 在 SQLAlchemy 中,with_entities 方法用于指定查詢語句返回的實體(Entity)或列(Column)。它允許你限制查詢的返回結果,只包含你感興趣的特定字段或實體 使用方法 假設有一個名為 User 的 SQLAlchemy 模型類,包含以下字段:…

Unity3D中如何降低游戲的Drawcall詳解

在Unity3D游戲開發中,Drawcall是一個至關重要的性能指標,它指的是CPU通知GPU繪制一個物體的命令次數。過多的Drawcall會導致游戲性能下降,因此優化Drawcall的數量是提高游戲性能的關鍵。本文將詳細介紹Unity3D中降低Drawcall的幾種主要方法&a…

設計模式使用場景實現示例及優缺點(行為型模式——模板方法模式)

模板方法模式(Template Method Pattern) 模板方法模式(Template Method Pattern)是一種行為設計模式,它定義了一個操作中的算法的骨架,將算法的一些步驟延遲到子類中。這樣可以在不改變算法的結構的前提下…

Git使用介紹教程

Git使用介紹教程 小白第一次寫博客,內容寫的可能不是很詳細,僅供參考,大家一起努力 gitee網址:https://gitee.com 大部分的開發團隊都以 Git 作為自己的版本控制工具,需要對 Git 的使用非常的熟悉。這篇文章中本人整理了自己在開發過程中經常使用到的 Git 命令,方便在偶…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官網:https://goharbor.io/ 點擊 Download now 鏈接,會自動跳轉到上述github頁面&am…

C++ | Leetcode C++題解之第233題數字1的個數

題目: 題解: class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代碼中,可以發現 k 并沒有被直接使用到(都是使用 10^k)// 但為了讓代碼看起來更加直觀,這里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、設置密碼驗證: 使用文本編輯器,這里使用Notepad,打開Redis服務配置文件。 注意:不要找錯了,通常為redis.windows-service.conf,而不是redis.windows.conf。后者是以非系統服務方式啟動程序使用的配置…

使用個人p12證書請求https接口數據

依賴 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>code package com.hexin.cbas.test;import org.apache.commons.net.util.TrustM…

《BASeg: Boundary aware semantic segmentation for autonomous driving》論文解讀

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代碼&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 語義分割是自動駕駛領域街道理解任務的重要組成部分。現有的各種方法要么專注于通過聚合全局或多尺度上下文…

曠野之間20 - Google 研究的推測 RAG

為什么選擇 RAG 新興能力 直到最近&#xff0c;人們發現 LLM 具有新興能力&#xff0c;即在與用戶或任務交互過程中出現的意外功能。 這些功能的示例包括&#xff1a; 解決問題&#xff1a; LLM 可以利用其語言理解和推理能力&#xff0c;為未經過明確培訓的任務提供富有洞…

js的原型鏈

原型鏈: 1.如何構成原型鏈&#xff1f; 2.原型鏈上屬性的增刪改查。 3.絕大多數對象的最終都會繼承自Object.prototype (var obj Object.create(null或者undefined)沒有原型)。 4.Object.create(原型)。 構成原型鏈和操作原型鏈屬性&#xff1a; //最頂的原型是Object.pro…

性能優化篇:SQL數據庫查表速度優化

SQL數據庫查詢的性能優化是確保數據庫能夠快速響應和高效處理請求的關鍵。以下是一些常見的SQL數據庫查詢性能優化方法: 索引優化: 創建適當的索引:為經常在WHERE子句中使用的列、JOIN操作涉及的列以及排序操作涉及的列創建索引。避免過多的索引:雖然索引可以提高查詢速度,…

python的字符串

字符串 簡單操作 創建 利用 ‘ ’ 或 “ ” 將字符或數字包裹起來的都為字符串 a"你好" 格式化字符串 元組的字符格式化 字符串格式化函數 srt.format() f格式化 方法 split()//指定分割符經行分割 strip()//指定移除字符頭尾的字符 join()//指定序列中的字符連接成新…

【Perl】Perl 語言入門

1. Perl語言介紹 Perl 是一種高級、解釋型、動態編程語言&#xff0c;由Larry Wall在1987年發布。Perl 以其強大的文本處理能力而聞名&#xff0c;特別是在處理報告生成、文件轉換、系統管理任務等方面。它吸收了C、Shell腳本語言、AWK、sed等語言的特性&#xff0c;并加入了大…

Go:常量運算符流程控制

目錄 一、常量 1.1 常量基本定義 1.2 常量組的定義 1.3 常量枚舉 二、運算符 2.1 算數運算符 2.2 關系運算符 2.3 邏輯運算符 2.4 位運算符 2.5 賦值運算符 2.6 指針運算符 2.7 運算符優先級 三、流程控制 3.1 if-else 條件語句 3.2 switch-case語句 3.3 for 循…

5、 測試

這里寫目錄標題 1、自動化測試簡介&#xff08;1&#xff09;自動化測試是什么&#xff08;2&#xff09;為什么要寫測試測試節約你的時間發現錯誤&#xff0c;預防錯誤測試使得代碼更有吸引力 2、基礎測試策略3、開始寫第一個測試&#xff08;1&#xff09;首先得有個bug&…

Not Invented Here 不是在這里發明的 / Proudly found elsewhere 自豪地在其他地方找到

注&#xff1a; 機翻&#xff0c;未校對。 兩篇關于創新管理的小文章 Not Invented Here 不是在這里發明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…