opencv直方圖與模板匹配

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()

直方圖

cv2.calcHist(images,channels,mask,histSize,ranges)

  • images: 原圖像圖像格式為 uint8 或 ?oat32。當傳入函數時應 用中括號 [] 括來例如[img]
  • channels: 同樣用中括號括來它會告函數我們統幅圖 像的直方圖。如果入圖像是灰度圖它的值就是 [0]如果是彩色圖像 的傳入的參數可以是 [0][1][2] 它們分別對應著 BGR。
  • mask: 掩模圖像。統整幅圖像的直方圖就把它為 None。但是如 果你想統圖像某一分的直方圖的你就制作一個掩模圖像并 使用它。
  • histSize:BIN 的數目。也應用中括號括來
  • ranges: 像素值范圍常為 [0256]
img = cv2.imread('cat.jpg',0) #0表示灰度圖
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape
plt.hist(img.ravel(),256); 
plt.show()

img = cv2.imread('cat.jpg') 
color = ('b','g','r')
for i,col in enumerate(color): histr = cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256]) 

?

?mask操作

# 創建mast
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show(mask,'mask')
img = cv2.imread('cat.jpg', 0)
cv_show(img,'img')
masked_img = cv2.bitwise_and(img, img, mask=mask)#與操作
cv_show(masked_img,'masked_img')
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

直方圖均衡化?

?

?

img = cv2.imread('clahe.jpg',0) #0表示灰度圖 #clahe
plt.hist(img.ravel(),256); 
plt.show()

?

equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256)
plt.show()

?

res = np.hstack((img,equ))
cv_show(res,'res')

自適應直方圖均衡化

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 
res_clahe = clahe.apply(img)
res = np.hstack((img,equ,res_clahe))
cv_show(res,'res')

模板匹配

模板匹配和卷積原理很像,模板在原圖像上從原點開始滑動,計算模板與(圖像被模板覆蓋的地方)的差別程度,這個差別程度的計算方法在opencv里有6種,然后將每次計算的結果放入一個矩陣里,作為結果輸出。假如原圖形是AxB大小,而模板是axb大小,則輸出結果的矩陣是(A-a+1)x(B-b+1)

# 模板匹配
img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0)
h, w = template.shape[:2] 
img.shape
template.shape
  • TM_SQDIFF:計算平方不同,計算出來的值越小,越相關
  • TM_CCORR:計算相關性,計算出來的值越大,越相關
  • TM_CCOEFF:計算相關系數,計算出來的值越大,越相關
  • TM_SQDIFF_NORMED:計算歸一化平方不同,計算出來的值越接近0,越相關
  • TM_CCORR_NORMED:計算歸一化相關性,計算出來的值越接近1,越相關
  • TM_CCOEFF_NORMED:計算歸一化相關系數,計算出來的值越接近1,越相關
    methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
    res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
    res.shape
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    min_val
    max_val
    min_loc
    max_loc
    for meth in methods:img2 = img.copy()# 匹配方法的真值method = eval(meth)print (method)res = cv2.matchTemplate(img, template, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 如果是平方差匹配TM_SQDIFF或歸一化平方差匹配TM_SQDIFF_NORMED,取最小值if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 畫矩形cv2.rectangle(img2, top_left, bottom_right, 255, 2)plt.subplot(121), plt.imshow(res, cmap='gray')plt.xticks([]), plt.yticks([])  # 隱藏坐標軸plt.subplot(122), plt.imshow(img2, cmap='gray')plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.show()

    ?

    ?

    匹配多個對象

    img_rgb = cv2.imread('mario.jpg')
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template = cv2.imread('mario_coin.jpg', 0)
    h, w = template.shape[:2]res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
    threshold = 0.8
    # 取匹配程度大于%80的坐標
    loc = np.where(res >= threshold)
    for pt in zip(*loc[::-1]):  # *號表示可選參數bottom_right = (pt[0] + w, pt[1] + h)cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)cv2.imshow('img_rgb', img_rgb)
    cv2.waitKey(0)

    ?

    ?

    ?

    ?

    ?

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

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

相關文章

Spring中Bean的生命周期以及Bean的單例與多例模式

一. Bean的生命周期 bean的生命周期可以表達為:bean的定義?bean的初始化?bean的使用?bean的銷毀 Bean的初始化過程 1)通過XML、Java annotation(注解)以及Java Configuration(配置類) 等方式加載Bea…

2023+HuggingGPT: Solving AI Tasks with ChatGPT and itsFriends in Hugging Face

摘要: 語言是llm(例如ChatGPT)連接眾多AI模型(例如hugs Face)的接口,用于解決復雜的AI任務。在這個概念中,llms作為一個控制器,管理和組織專家模型的合作。LLM首先根據用戶請求規劃任務列表,然后為每個任務分配專家模…

Unity 鼠標實現對物體的移動、縮放、旋轉

文章目錄 1. 代碼2. 測試場景 1. 代碼 using UnityEngine;public class ObjectManipulation : MonoBehaviour {// 縮放比例限制public float MinScale 0.2f;public float MaxScale 3.0f;// 縮放速率private float scaleRate 1f;// 新尺寸private float newScale;// 射線pri…

【Windows系統編程】03.遠線程注入ShellCode

shellcode&#xff1a;本質上也是一段普通的代碼&#xff0c;只不過特殊的編程手法&#xff0c;可以在任意環境下&#xff0c;不依賴于原有的依賴庫執行。 遠程線程 #include <iostream> #include <windows.h> #include <TlHelp32.h>int main(){HANDLE hPr…

Educational Codeforces Round 153 (Rated for Div. 2)ABC

Educational Codeforces Round 153 (Rated for Div. 2) 目錄 A. Not a Substring題目大意思路核心代碼 B. Fancy Coins題目大意思想核心代碼 C. Game on Permutation題目大意思想核心代碼 A. Not a Substring 題目大意 給定一個只包含“&#xff08;”和“&#xff09;”這兩…

react-native-webview RN和html雙向通信

rn登錄后得到的token需要傳遞給網頁&#xff0c;js獲取到的瀏覽器信息需要傳遞給rn RN Index.js: import React from react import { WebView } from react-native-webview import useList from ./useListexport default function Index(props) {const { uri, jsCode, webVie…

iPhone刪除的照片能恢復嗎?不小心誤刪了照片怎么找回?

iPhone最近刪除清空了照片還能恢復嗎&#xff1f;大家都知道&#xff0c;照片對于我們來說是承載著美好回憶的一種形式。它記錄著我們的平淡生活&#xff0c;也留住了我們的美好瞬間&#xff0c;具有極其重要的紀念價值。 照片不小心誤刪是一件非常難受的事&#xff0c;那么iP…

android TextView 超出長度使用省略號

在Android中最常見的需求&#xff0c;就是在在外部展示信息時&#xff0c;需要簡要展示內容。TextView僅需在靜態布局文件中設置以下幾個屬性&#xff1a; android:maxWidth“100dp” // 寬度是多少才算超出 android:maxLines"2" // 高度多少才算超出 android:elli…

React下載文件的兩種方式

React下載文件的兩種方式 - 代碼先鋒網 不知道有用沒用看著挺整齊 沒試過 1、GET類型下載 download url > {const eleLink document.createElement(a);eleLink.style.display none;// eleLink.target "_blank"eleLink.href url;// eleLink.href record;d…

Centos7 配置Docker鏡像加速器

docker實戰(一):centos7 yum安裝docker docker實戰(二):基礎命令篇 docker實戰(三):docker網絡模式(超詳細) docker實戰(四):docker架構原理 docker實戰(五):docker鏡像及倉庫配置 docker實戰(六):docker 網絡及數據卷設置 docker實戰(七):docker 性質及版本選擇 認知升…

CentOS系統環境搭建(五)——Centos7安裝maven

centos系統環境搭建專欄&#x1f517;點擊跳轉 Centos7安裝maven 下載壓縮包 maven下載官網 解壓 壓縮包放置到/usr/local tar -xvf apache-maven-3.9.2-bin.tar.gz配置環境變量 vim /etc/profile在最下面追加 MAVEN_HOME/usr/local/apache-maven-3.9.2 export PATH${MAV…

Jenkins 監控dist.zip文件內容發生變化 觸發自動部署

為Jenkins添加plugin http://xx:xx/manage 創建一個任務 構建觸發器 每3分鐘掃描一次&#xff0c;發現指定文件build.zip文件的MD5發生變化后 觸發任務

【C++學習手札】一文帶你認識C++虛繼承??

食用指南&#xff1a;本文在有C基礎的情況下食用更佳 &#x1f340;本文前置知識&#xff1a;C虛函數&#xff08;很重要&#xff0c;內部剖析&#xff09; ??今日夜電波&#xff1a;僕らのつづき—柊優花 1:06 ━━━━━━?&#x1f49f;──────── 3:51 …

創建密碼庫/創建用戶帳戶/更新 Ansible 庫的密鑰/ 配置cron作業

目錄 創建密碼庫 創建用戶帳戶 更新 Ansible 庫的密鑰 配置cron作業 創建密碼庫 按照下方所述&#xff0c;創建一個 Ansible 庫來存儲用戶密碼&#xff1a; 庫名稱為 /home/curtis/ansible/locker.yml 庫中含有兩個變量&#xff0c;名稱如下&#xff1a; pw_developer&#…

神經網絡基礎-神經網絡補充概念-39-梯度消失與梯度爆炸

簡介 梯度消失和梯度爆炸是在深度神經網絡中訓練過程中可能出現的問題&#xff0c;導致模型難以訓練或無法收斂。這些問題與反向傳播算法中的梯度計算有關。 概念 梯度消失&#xff08;Gradient Vanishing&#xff09;&#xff1a;在深層神經網絡中&#xff0c;特別是具有很…

File inclusion

文章目錄 File inclusion(local)File inclusion(remote) File inclusion(local) 隨便選擇一個點擊提交&#xff0c;提交后觀察 url ?filename 我們可以使用相對路徑../../../../../訪問我們想要看到的文件內容 查看windows系統的主機映射文件../../../../Windows/System32/…

ShardingSphere 可觀測 SQL 指標監控

ShardingSphere并不負責如何采集、存儲以及展示應用性能監控的相關數據&#xff0c;而是將SQL解析與SQL執行這兩塊數據分片的最核心的相關信息發送至應用性能監控系統&#xff0c;并交由其處理。 換句話說&#xff0c;ShardingSphere僅負責產生具有價值的數據&#xff0c;并通過…

Go 語言中排序的 3 種方法

原文鏈接&#xff1a; Go 語言中排序的 3 種方法 在寫代碼過程中&#xff0c;排序是經常會遇到的需求&#xff0c;本文會介紹三種常用的方法。 廢話不多說&#xff0c;下面正文開始。 使用標準庫 根據場景直接使用標準庫中的方法&#xff0c;比如&#xff1a; sort.Intsso…

【C++】AVL樹(平衡二叉樹)

目錄 一、AVL樹的定義二、AVL樹的作用三、AVL樹的插入操作插入——平衡因子的更新插入——左單旋插入——右單旋插入——左右雙旋插入——右左雙旋 四、ALVL樹的驗證五、AVL樹的性能 一、AVL樹的定義 AVL樹&#xff0c;全稱 平衡二叉搜索&#xff08;排序&#xff09;樹。 二…

一次Linux圖形化界面恢復

一次Linux 圖形化界面恢復 一次Linux 圖形化界面恢復出現問題場景問題排查 一次Linux 圖形化界面恢復 出現問題場景 使用xmanager遠程連接虛機的CentOS7系統圖形界面出現已拒絕x11轉移申請問題&#xff0c;在折騰X11過程中&#xff0c;安裝與卸載的過程中不小心把xorg-x11-xa…