主頁 > 軟體工程 > 如何在Python中用透明替換PNG影像中的選中圖案?

如何在Python中用透明替換PNG影像中的選中圖案?

2022-10-26 16:34:27 軟體工程

我正在嘗試使用 Python 腳本在某些 PNG 中使用透明顏色(alpha 通道)洗掉方格背景(在 Adob??e Illustrator 和 Photoshop 中表示透明背景)。

首先,我使用模板匹配

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('testimages/fake1.png', cv2.IMREAD_UNCHANGED)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('pattern.png', 0)

w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)

for pt in zip(*loc[::-1]):
    if len(img_rgb[0][0]) == 3:
        # add alpha channel
        rgba = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2RGBA)
        rgba[:, :, 3] = 255 # default not transparent
        img_rgb = rgba
    # replace the area with a transparent rectangle
    cv2.rectangle(img_rgb, pt, (pt[0]   w, pt[1]   h), (255, 255, 255, 0), -1) 

cv2.imwrite('result.png', img_rgb)

來源圖片:fake1.png

如何在Python中用透明替換PNG影像中的選中圖案?

圖案模板:pattern.png

如何在Python中用透明替換PNG影像中的選中圖案?

輸出:result.png(灰色區域實際上是透明的;放大一點以便查看)

如何在Python中用透明替換PNG影像中的選中圖案?

我知道這種方法存在問題,因為在某些情況下,無法完全識別模板,因為部分圖案被 PNG 影像中的圖形隱藏。

我的問題是:如何使用 OpenCV 完美匹配這樣的模式?通過 FFT 濾波?

參考:

  • 如何在Python中用透明替換PNG影像中的選中圖案?

    import cv2
    import numpy as np
    
    # read input
    img = cv2.imread("fake.png")
    
    # threshold on checks
    low = (230,230,230)
    high = (255,255,255)
    mask = cv2.inRange(img, low, high)
    
    # invert alpha
    alpha = 255 - mask
    
    # convert img to BGRA
    result = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
    result[:,:,3] = alpha
    
    # save output
    cv2.imwrite('fake_transparent.png', result)
    
    cv2.imshow('img', img)
    cv2.imshow('mask', mask)
    cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    如何在Python中用透明替換PNG影像中的選中圖案?

    下載生成的影像以查看它實際上是透明的。

    uj5u.com熱心網友回復:

    這是使用 DFT 在 Python/OpenCV/Numpy 中處理影像的一種方法。確實需要知道棋盤圖案的大小(淺色或深色方形尺寸)。

    • 讀取輸入
    • 獨立通道
    • 將 DFT 應用于每個通道
    • 將原點從左上角移到每個通道的中心
    • 從每個通道中提取幅度和相位影像
    • 定義棋盤格圖案大小
    • 創建相同大小的黑白棋盤影像
    • 對棋盤影像應用類似的 DFT 處理
    • 從日志中獲取頻譜(幅度)
    • 對光譜進行閾值化以形成掩模
    • 將掩模中的 DC 中心點歸零
    • 選項:如果需要,應用形態擴張以加厚白點。但這里似乎不需要
    • 反轉蒙版,使背景為白色,點為黑色
    • 將掩碼轉換為 0 到 1 的范圍并制作 2 個通道
    • 將雙通道掩碼應用于中心偏移的 DFT 通道
    • 在每個蒙版影像中將中心移回左上角
    • 做 IDFT 以在每個通道上從復雜域回傳到真實域
    • 將生成的通道合并回 BGR 影像作為最終的重構影像
    • 保存結果

    輸入:

    如何在Python中用透明替換PNG影像中的選中圖案?

    import numpy as np
    import cv2
    import math
    
    # read input 
    # note: opencv fft only works on grayscale
    img = cv2.imread('fake.png')
    hh, ww = img.shape[:2]
    
    # separate channels
    b,g,r = cv2.split(img)
    
    # convert images to floats and do dft saving as complex output
    dft_b = cv2.dft(np.float32(b), flags = cv2.DFT_COMPLEX_OUTPUT)
    dft_g = cv2.dft(np.float32(g), flags = cv2.DFT_COMPLEX_OUTPUT)
    dft_r = cv2.dft(np.float32(r), flags = cv2.DFT_COMPLEX_OUTPUT)
    
    # apply shift of origin from upper left corner to center of image
    dft_b_shift = np.fft.fftshift(dft_b)
    dft_g_shift = np.fft.fftshift(dft_g)
    dft_r_shift = np.fft.fftshift(dft_r)
    
    # extract magnitude and phase images
    mag_b, phase_b = cv2.cartToPolar(dft_b_shift[:,:,0], dft_b_shift[:,:,1])
    mag_g, phase_g = cv2.cartToPolar(dft_g_shift[:,:,0], dft_g_shift[:,:,1])
    mag_r, phase_r = cv2.cartToPolar(dft_r_shift[:,:,0], dft_r_shift[:,:,1])
    
    # set check size (size of either dark or light square)
    check_size = 15
    
    # create checkerboard pattern
    white = np.full((check_size,check_size), 255, dtype=np.uint8)
    black = np.full((check_size,check_size), 0, dtype=np.uint8)
    checks1 = np.hstack([white,black])
    checks2 = np.hstack([black,white])
    checks3 = np.vstack([checks1,checks2])
    numht = math.ceil(hh / (2*check_size))
    numwd = math.ceil(ww / (2*check_size))
    checks = np.tile(checks3, (numht,numwd))
    checks = checks[0:hh, 0:ww]
    
    # apply dft to checkerboard pattern
    dft_c = cv2.dft(np.float32(checks), flags = cv2.DFT_COMPLEX_OUTPUT)
    dft_c_shift = np.fft.fftshift(dft_c)
    mag_c, phase_c = cv2.cartToPolar(dft_c_shift[:,:,0], dft_c_shift[:,:,1])
    
    # get spectrum from magnitude (add tiny amount to avoid divide by zero error)
    spec = np.log(mag_c   0.00000001)
    
    # theshold spectrum
    mask = cv2.threshold(spec, 1, 255, cv2.THRESH_BINARY)[1]
    
    # mask DC point (center spot)
    centx = int(ww/2)
    centy = int(hh/2)
    dot = np.zeros((3,3), dtype=np.uint8)
    mask[centy-1:centy 2, centx-1:centx 2] = dot
    
    # If needed do morphology dilate by small amount. 
    # But does not seem to be needed in this case
    
    # invert mask
    mask = 255 - mask
    
    # apply mask to real and imaginary components
    mask1 = (mask/255).astype(np.float32)
    mask2 = cv2.merge([mask1,mask1])
    complex_b = dft_b_shift*mask2
    complex_g = dft_g_shift*mask2
    complex_r = dft_r_shift*mask2
    
    # shift origin from center to upper left corner
    complex_ishift_b = np.fft.ifftshift(complex_b)
    complex_ishift_g = np.fft.ifftshift(complex_g)
    complex_ishift_r = np.fft.ifftshift(complex_r)
    
    # do idft with normalization saving as real output and crop to original size
    img_notch_b = cv2.idft(complex_ishift_b, flags=cv2.DFT_SCALE cv2.DFT_REAL_OUTPUT)
    img_notch_b = img_notch_b.clip(0,255).astype(np.uint8)
    img_notch_b = img_notch_b[0:hh, 0:ww]
    img_notch_g = cv2.idft(complex_ishift_g, flags=cv2.DFT_SCALE cv2.DFT_REAL_OUTPUT)
    img_notch_g = img_notch_g.clip(0,255).astype(np.uint8)
    img_notch_g = img_notch_g[0:hh, 0:ww]
    img_notch_r = cv2.idft(complex_ishift_r, flags=cv2.DFT_SCALE cv2.DFT_REAL_OUTPUT)
    img_notch_r = img_notch_r.clip(0,255).astype(np.uint8)
    img_notch_r = img_notch_r[0:hh, 0:ww]
    
    # combine b,g,r components
    img_notch = cv2.merge([img_notch_b, img_notch_g, img_notch_r])
    
    # write result to disk
    cv2.imwrite("fake_checks.png", checks)
    cv2.imwrite("fake_spectrum.png", (255*spec).clip(0,255).astype(np.uint8))
    cv2.imwrite("fake_mask.png", mask)
    cv2.imwrite("fake_notched.png", img_notch)
    
    # show results
    cv2.imshow("ORIGINAL", img)
    cv2.imshow("CHECKS", checks)
    cv2.imshow("SPECTRUM", spec)
    cv2.imshow("MASK", mask)
    cv2.imshow("NOTCH", img_notch)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    棋盤影像:

    如何在Python中用透明替換PNG影像中的選中圖案?

    棋盤譜:

    如何在Python中用透明替換PNG影像中的選中圖案?

    面具:

    如何在Python中用透明替換PNG影像中的選中圖案?

    結果(缺口過濾影像):

    如何在Python中用透明替換PNG影像中的選中圖案?

    結果中的棋盤圖案與原始圖案相比有所減輕,但經過仔細檢查后仍然存在。

    從這里開始,需要在白色背景上設定閾值并反轉以制作 Alpha 通道的影像。然后將影像轉換為 4 BGRA 并將 alpha 通道插入到 BGRA 影像中,如下面的其他答案中所述。

    uj5u.com熱心網友回復:

    由于您正在處理具有透明背景的PNG,因此與其嘗試檢測方格背景,不如嘗試提取未方格的內容,這可能同樣可行。這可以通過對所有像素進行顏色檢查來實作。你可以使用opencv的inRange()功能。我將在下面鏈接一個 StackOverflow 鏈接,該鏈接試圖檢測影像上的黑點。 范圍內的例子

    轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/519710.html

    標籤:Pythonopencv

    上一篇:OpenCV-從目錄中的一組影像創建視頻

    下一篇:通過OpenCV在Python中編輯影像并在PyQt5ImageView中顯示?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more