Opencv之掩碼實現圖片摳圖

掩碼實現圖片摳圖

目錄

  • 掩碼實現圖片摳圖
    • 1 掩碼
      • 1.1 概念
      • 1.2 創建掩碼
      • 1.3摳圖思路
    • 2 代碼測試

1 掩碼


1.1 概念

掩碼(Mask)是一種用于指定圖像處理操作區域的工具掩碼通常是一個與圖像尺寸相同的二值圖像,其中像素值為0表示不處理,像素值為255(或1)表示處理。掩碼可以用于多種操作,如圖像濾波、圖像合成、圖像分割等。掩碼的尺寸必須與圖像的尺寸相同。掩碼的像素值通常為0或255(或1),但也可以是其他值,具體取決于應用場景。通過使用掩碼,可以更精確地控制圖像處理操作的范圍,從而實現更復雜的效果。

1.2 創建掩碼

  • mask = np.zeros((height, width), dtype=np.uint8),創建一個全黑的掩碼
    • (height, width), 高寬
    • dtype=np.uint8 ,數據類型
  • cv2.rectangle(mask, (x1, y1), (x2, y2), 255, -1),在掩碼上繪制矩形
    • (x1, y1), (x2, y2)起點和對角線坐標 ,
    • 255顏色, -1表全填充
import cv2
import numpy as np
# 創建一個全黑的掩碼
mask = np.zeros((300, 300), dtype=np.uint8)
# 在掩碼上繪制一個白色矩形
cv2.rectangle(mask, (50, 50), (100, 100), 255, -1)
cv2.imshow('mask',mask)
cv2.waitKey(0)

運行如下
在這里插入圖片描述

1.3摳圖思路

  • 圖像讀取與預處理
    讀取圖像并轉換為灰度圖,進行高斯濾波以減少噪聲。

  • 邊緣檢測
    使用Canny算法檢測圖像中的邊緣。

  • 輪廓檢測與排序
    查找圖像中的輪廓,并根據面積進行排序

  • 二值化處理
    對灰度圖進行二值化處理,確定閾值。

  • 輪廓篩選
    根據輪廓的寬度、高度和寬高比篩選出符合條件的輪廓。

  • 掩碼操作
    在掩碼上繪制篩選后的輪廓,并對原圖像和掩碼進行與操作,以提取區域。

2 代碼測試

原圖

在這里插入圖片描述

代碼展示:

import numpy as np
import cv2# 定義一個函數用于顯示圖像,并等待用戶按下任意鍵關閉窗口
def cv_chow(name, img):cv2.imshow(name, img)cv2.waitKey(0)# 定義一個函數用于對四個點進行排序,返回一個有序的矩形頂點列表
def order_points(pts):rect = np.zeros((4, 2), dtype="float32")s = pts.sum(axis=1)  # 計算每個點的x和y坐標之和rect[0] = pts[np.argmin(s)]  # 最小的和為左上角rect[2] = pts[np.argmax(s)]  # 最大的和為右下角diff = np.diff(pts, axis=1)  # 計算每個點的x和y坐標之差rect[1] = pts[np.argmin(diff)]  # 最小的差為右上角rect[3] = pts[np.argmax(diff)]  # 最大的差為左下角return rect# 定義一個函數用于對輪廓進行排序,支持從左到右、從右到左、從上到下、從下到上四種排序方式
def sort_contours(cons, method='left-to-right'):reverse = Falsei = 0if method == 'right-to-left' or method == 'bottom-to-top':reverse = Trueif method == 'top-to-bottom' or method == 'bottom-to-top':i = 1boundingBoxes = [cv2.boundingRect(c) for c in cons]  # 獲取每個輪廓的邊界框(cons, boundingBoxes) = zip(*sorted(zip(cons, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))return cons, boundingBoxes# 讀取圖像
img = cv2.imread('img_3.png')# 復制圖像用于繪制輪廓
cont_img = img.copy()# 將圖像轉換為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 對灰度圖進行高斯濾波,以減少噪聲
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv_chow('blurred', blurred)# 使用Canny邊緣檢測算法檢測圖像中的邊緣
edg = cv2.Canny(blurred, 75, 200)
cv_chow('edg', edg)# 查找圖像中的輪廓
cnts = cv2.findContours(edg.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]# 在圖像上繪制所有輪廓
cv2.drawContours(cont_img, cnts, -1, (0, 0, 255), 3)
cv_chow('cont_img', cont_img)# 根據輪廓面積對輪廓進行排序,從大到小
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)# 對灰度圖進行二值化處理,使用Otsu's方法自動確定閾值
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv_chow('thresh', thresh)# 在二值化圖像中查找輪廓
thresh_cnt = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]# 初始化一個列表用于存儲符合條件的輪廓
qus_cnts = []# 初始化一個列表用于存儲所有的掩碼
mask_all = []# 創建一個與二值化圖像大小相同的黑色掩碼
mask = np.zeros(thresh.shape, dtype='uint8')# 遍歷所有輪廓,篩選出符合條件的輪廓
for c in thresh_cnt:(x, y, w, h) = cv2.boundingRect(c)  # 獲取輪廓的邊界框ar = w / float(h)  # 計算邊界框的寬高比if w >= 8 and h >= 10 and 0.5 <= ar <= 2:  # 根據寬度、高度和寬高比篩選輪廓qus_cnts.append(c)# 遍歷篩選后的輪廓,繪制掩碼并進行與操作
for i in qus_cnts:cv2.drawContours(mask, [i], -1, 255, -1)  # 在掩碼上繪制輪廓cv_chow('mask', mask)img_mask_and = cv2.bitwise_and(img, img, mask=mask)  # 對原圖像和掩碼進行與操作cv_chow('img_mask_and', img_mask_and)

運行結果:

在這里插入圖片描述

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

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

相關文章

QT編程之JSON處理

一、核心類庫及功能 Qt 提供了一套完整的 JSON 處理類庫&#xff08;位于 QtCore 模塊&#xff09;&#xff0c;支持解析和生成 JSON 數據&#xff1a; ?QJsonDocument?&#xff1a;表示完整的 JSON 文檔&#xff0c;支持從 QJsonObject 或 QJsonArray 初始化?。?QJsonOb…

在虛擬環境里面配置Linux系統

Linux系統有很多版本&#xff0c;常用的有Ubantu烏班圖&#xff0c;和CentOS 不同的版本在使用的時候&#xff0c;有部分執行方式的不同 安裝的流程都一樣 首先&#xff0c;想要安裝Ubantu&#xff0c;要去它的官網&#xff0c;找下載連接&#xff0c;然后下載iso后綴的安裝…

CentOS7下安裝MongoDB

步驟 1&#xff1a;創建 MongoDB Yum 倉庫文件 你需要創建一個 MongoDB 的 Yum 倉庫配置文件&#xff0c;以便從官方源下載 MongoDB。打開終端并使用以下命令創建并編輯該文件&#xff1a; sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo 在打開的文件中&#xff0c;輸入以下…

機器視覺工程師如何學習C#通訊

建議大家可以提前測試&#xff0c;真實模擬現場的情況&#xff0c;或者采用虛擬串口&#xff0c;虛擬網口頻繁測試通訊的穩定性&#xff0c;以后有現場需要&#xff0c;可以快速布局到現場。 機器視覺工程師學習C#通訊協議需要結合工業場景需求&#xff0c;掌握基礎協議原理、常…

40.動態規劃13

回文子串 class Solution { public:int countSubstrings(string s) {int ns.size();vector<vector<int>> dp(n,vector<int>(n,0));int res0;for(int i0;i<n;i){for(int ji;j>0;j--){if(ij){dp[i][j]1;res;}else{if(s[i]s[j]){if(abs(i-j)<2){dp[i]…

基于ssm的一家運動鞋店的產品推廣網站的設計

項目簡介 一家運動鞋店實現了以下功能&#xff1a; 實現了用戶在線選擇試題并完成答題&#xff0c;在線查看考核分數。管理員管理收貨地址管理、購物車管理、字典管理、留言版管理、新聞信息管理、產品管理、產品收藏管理、產品評價管理、產品訂單管理、單頁數據管理、用戶管…

3.14學習總結

今天完成了幾道關于二叉樹的算法題 關于二叉樹的最小最大深度和數據流中的第k大元素&#xff0c;用到優先隊列&#xff0c;學習了有關java的基礎知識&#xff0c;學習了雙指針法。

spring boot3 kafka集群搭建到使用

首先自行安裝docker&#xff0c;通過docker容器安裝kafka CentOS 系統 docker安裝地址 1.pom.xml和application.properties或者application.yml文件配置 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</arti…

基于 RWA 模型與 AI - Agent 協同的企業級 aPAAS 架構設計

一、引言 在企業數字化轉型不斷深化的當下&#xff0c;現實世界資產&#xff08;RWA&#xff09;模型與人工智能智能體&#xff08;AI - Agent&#xff09;的協同融合&#xff0c;為企業級應用平臺即服務&#xff08;aPAAS&#xff09;架構的創新發展帶來了新契機。這種架構旨在…

Flutter PopScope對于iOS設置canPop為false無效問題

這個問題應該出現很久了&#xff0c;之前的組件WillPopScope用的好好的&#xff0c;flutter做優化打算“軟性”處理禁用返回手勢&#xff0c;出了PopScope&#xff0c;這個組件也能處理在安卓設備上的左滑返回事件。但是iOS上面左滑返回手勢禁用&#xff0c;一直無效。 當然之…

基爾霍夫定律課后學習日志

基爾霍夫定律課后日志 今天在學習基爾霍夫定律后&#xff0c;我對它在實際工程中的價值有了全新的認識。 基爾霍夫電流定律&#xff08;KCL&#xff09;和電壓定律&#xff08;KVL&#xff09;是電路分析的基石。在電子電路設計領域&#xff0c;這兩個定律發揮著關鍵作用。以…

矩陣交換行(信息學奧賽一本通-1119)

【題目描述】 給定一個55的矩陣(數學上&#xff0c;一個rc的矩陣是一個由r行c列元素排列成的矩形陣列)&#xff0c;將第n行和第m行交換&#xff0c;輸出交換后的結果。 【輸入】 輸入共6行&#xff0c;前5行為矩陣的每一行元素,元素與元素之間以一個空格分開。 第6行包含兩個整…

SWPU 2022 新生賽

webdog1__start if (isset($_GET[web])) {$first$_GET[web];if ($firstmd5($first)) md5 自等 web0e215962017 &#xff08;md5后也是 0e) 登入后得到提示&#xff0c;robots.txt 訪問 f14g.php 返回包里發現 hint > if (isset($_GET[get])){$get$_GET[get];if(!strs…

什么是 Redis

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的鍵值存儲系統&#xff0c;常用作數據庫、緩存和消息中間件。它支持多種數據結構&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;并提供豐富的操作命令。 主要特點 高性能&am…

海數通-海員數字化管理平臺(企業數字化)

產品介紹 海數通產品是一套海員數字化管理平臺&#xff0c;為企業提供海員檔案、海歷、動態、證書、培訓、晉升、薪資、社險等全流程多維度的智能化管理能力。薪資計算模型和社險計算模型能夠自動并準確的完成復雜的工資、社險計算工作&#xff0c;極大的提高工作效率和準確性…

如何處理PHP中的日期和時間問題

如何處理PHP中的日期和時間問題 在PHP開發中&#xff0c;日期和時間的處理是一個常見且重要的任務。無論是記錄用戶操作時間、生成時間戳&#xff0c;還是進行日期計算&#xff0c;PHP提供了豐富的函數和類來幫助開發者高效處理這些需求。本文將詳細介紹如何在PHP中處理日期和…

【SpringMVC】入門版

1.基本概念 1.1三層架構 三層架構也就是我們常說的b/s架構中的表現層&#xff0c;業務層和持久層,每層都各司其職&#xff0c;下面來分別講解這三層的作用。 表現層&#xff1a; 也就是我們常說的web層。它負責接收客戶端的請求&#xff0c;向客戶端響應結果&#xff0c;通…

【Java進階學習 第八篇】石頭迷陣游戲

繪制頁面 首先繪制指定寬和高的窗體 JFrame frame new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石頭迷陣單機版v1.0");//想讓游戲一直在屏幕的最上層frame.setAlwaysOnTop(true);//想讓窗…

wireguard搭配udp2raw部署內網

前言 上一篇寫了使用 wireguard 可以非常輕松的進行組網部署&#xff0c;但是如果服務器廠商屏蔽了 udp 端口&#xff0c;那就沒法了 針對 udp 被服務器廠商屏蔽的情況&#xff0c;需要使用一款 udp2raw 或 socat 類似的工具&#xff0c;來將 udp 打包成 tcp 進行通信 這里以…

Node.js REPL 深入解析

Node.js REPL 深入解析 引言 Node.js 作為一種流行的 JavaScript 運行環境,在服務器端開發中扮演著重要角色。REPL(Read-Eval-Print Loop,讀取-求值-打印循環)是 Node.js 的一個核心特性,它允許開發者在一個交互式環境中執行 JavaScript 代碼。本文將深入探討 Node.js R…