OpenCV基本的圖像處理

參考資料:

參考視頻

視頻參考資料:鏈接: https://pan.baidu.com/s/1_DJTOerxpu5_dSfd4ZNlAA 提取碼: 8v2n

相關代碼


概述:

? ? ? ? 因為本人是用于機器視覺的圖像處理,所以只記錄了OpenCV的形態學操作圖像平滑處理兩部分


形態學操作:

? ? ? ? 形態學操作主要包括:膨脹和腐蝕 、開閉運算、黑帽和禮帽

膨脹和腐蝕

  • 腐蝕和膨脹是最基本的形態學操作,腐蝕和膨脹都是針對白色部分(高亮部分)而言的。
  • 膨脹就是使圖像中高亮部分擴張,效果圖擁有比原圖更大的高亮區域;
  • 腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域
  • 膨脹是求局部最大值的操作,腐蝕是求局部最小值的操作。
腐蝕

1. 原理

????????具體操作是:用一個結構元素掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆蓋的像素做“與”操作如果都為1,則該像素為1,否則為0

????????如下圖所示,結構A被結構B腐蝕后:

腐蝕的作用是消除物體邊界點,使目標縮小,可以消除小于結構元素的噪聲點

2. API:

 cv.erode(img,kernel,iterations)

參數:

  • img: 要處理的圖像
  • kernel: 核結構
  • iterations: 腐蝕的次數,默認是1
膨脹

1. 原理

????????具體操作是:用一個結構元素掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆蓋的像素做“與”操作,如果都為0,則該像素為0,否則為1

????????如下圖所示,結構A被結構B腐蝕后:

膨脹的作用是將與物體接觸的所有背景點合并到物體中,使目標增大可添補目標中的孔洞

2. API

 cv.dilate(img,kernel,iterations)

參數:

  • img: 要處理的圖像

  • kernel: 核結構

  • iterations: 腐蝕的次數,默認是1
示例
import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 支持中文
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 讀取圖像
img = cv.imread("./image/image3.png")
# 2 創建核結構
kernel = np.ones((5, 5), np.uint8)# 3 圖像腐蝕和膨脹
erosion = cv.erode(img, kernel) # 腐蝕
dilate = cv.dilate(img,kernel) # 膨脹# 4 圖像展示
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img)
axes[0].set_title("原圖")
axes[1].imshow(erosion)
axes[1].set_title("腐蝕后結果")
axes[2].imshow(dilate)
axes[2].set_title("膨脹后結果")
plt.show()

?

開閉運算?

  • 開運算和閉運算是將腐蝕和膨脹按照一定的次序進行處理
  • 但這兩者并不是互為逆運算,即先開后閉并不能得到原來的圖像。
開運算
  • 原理:?先腐蝕后膨脹
  • 作用:
    • 1.?分離物體,消除小區域
    • 2.?消除噪點,去除小的干擾塊,而不影響原來的圖像。

閉運算?
  • 原理:先膨脹后腐蝕
  • 作用:
    • 是消除/“閉合”物體里面的孔洞
    • 可以填充閉合區域

?API

cv.morphologyEx(img, op, kernel)

參數:

  • img: 要處理的圖像
  • op: 處理方式:若進行開運算,則設為cv.MORPH_OPEN,若進行閉運算,則設為cv.MORPH_CLOSE
  • Kernel: 核結構

示例

import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 支持中文
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 讀取圖像
img1 = cv.imread("./image/image5.png")
img2 = cv.imread("./image/image6.png")
# 2 創建核結構
kernel = np.ones((10, 10), np.uint8)
# 3 圖像的開閉運算
cvOpen = cv.morphologyEx(img1,cv.MORPH_OPEN,kernel) # 開運算
cvClose = cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel)# 閉運算
# 4 圖像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原圖")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("開運算結果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原圖")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("閉運算結果")
plt.show()

黑帽禮帽

? ? ? ? 黑帽和禮帽運算通常是用來得到圖形的輪廓的

禮帽運算
  • ?原理:原圖和開運算之差
  • ?作用:得到比原圖輪廓更明亮的輪廓 ,效果和核大小有關
  • ?用來分離比鄰近點亮一些的斑塊
黑帽運算
  • ?原理:原圖和閉運算之差
  • ?作用:得到比原圖輪廓更明暗的輪廓 ,效果和核大小有關
  • ?用來分離比鄰近點暗一些的斑塊

API

cv.morphologyEx(img, op, kernel)

參數:

  • img: 要處理的圖像

  • op: 處理方式:

  • Kernel: 核結構

示例

import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 讀取圖像
img1 = cv.imread("./image/image5.png")
img2 = cv.imread("./image/image6.png")
# 2 創建核結構
kernel = np.ones((10, 10), np.uint8)
# 3 圖像的禮帽和黑帽運算
cvOpen = cv.morphologyEx(img1,cv.MORPH_TOPHAT,kernel) # 禮帽運算
cvClose = cv.morphologyEx(img2,cv.MORPH_BLACKHAT,kernel)# 黑帽運算
# 4 圖像顯示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原圖")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("禮帽運算結果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原圖")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("黑帽運算結果")
plt.show()

圖像平滑:

噪聲的分類

椒鹽噪聲
  • 隨機的黑點或白點

高斯噪聲?
  • 顏色或灰度值隨機,位置隨機的彩色斑點
  • 通常灰度值符合高斯分布

?噪聲的處理

均值濾波

原理:將核區域內的灰度值進行平均,來代替中心元素

優點:速度快

缺點:去除噪點的效果很差,且被處理的圖像會變得模糊

?

?API

cv.blur(src, ksize, anchor, borderType)

參數:

  • src:輸入圖像
  • ksize:卷積核的大小
  • anchor:默認值 (-1,-1) ,表示核中心
  • borderType:邊界類型

相關代碼:

import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 支持中文
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 圖像讀取
img = cv.imread('./image/dogsp.jpeg')
# 2 均值濾波
blur = cv.blur(img,(5,5))
# 3 圖像顯示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原圖')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值濾波后結果')
plt.xticks([]), plt.yticks([])
plt.show()
高斯濾波
  • 以當前像素點為中心,以所規定的核為單位,根據與中心點距離獲得權重,核中所有像素點權重和為1

  • 然后每個像素點的灰度值*權重

  • 然后9個點的結果相加,就是中心點的灰度值
  • 高斯濾波對高斯噪聲效果比較好,但是對椒鹽噪聲效果一般

API:

cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)

參數:

  • src: 輸入圖像
  • ksize:高斯卷積核的大小,注意?: 卷積核的寬度和高度都應為奇數,且可以不同
  • sigmaX: 水平方向的標準差
  • sigmaY: 垂直方向的標準差,默認值為0,表示與sigmaX相同
  • borderType:填充邊界類型

示例:

import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 支持中文
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 圖像讀取
img = cv.imread('./image/dogGauss.jpeg')
# 2 高斯濾波
blur = cv.GaussianBlur(img,(3,3),1)
# 3 圖像顯示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原圖')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯濾波后結果')
plt.xticks([]), plt.yticks([])
plt.show()
中值濾波
  • 取中心點所在核的灰度值的中值,作為中心點新的灰度值

  • 中值濾波對椒鹽噪聲尤為有效,是處理椒鹽噪聲的首選之一

API

cv.medianBlur(src, ksize )

?示例

import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 支持中文
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1 圖像讀取
img = cv.imread('./image/dogsp.jpeg')
# 2 中值濾波
blur = cv.medianBlur(img,5)
# 3 圖像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原圖')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('中值濾波后結果')
plt.xticks([]), plt.yticks([])
plt.show()

總結

? ? ? ? 相對于膨脹和腐蝕,開閉運算效果會更好

? ? ? ? 噪聲的消除中,中值濾波和高斯濾波是不錯的選擇

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

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

相關文章

Git 與 GitHub 學習筆記

本文是一份全面的 Git 入門指南,涵蓋了從環境配置、創建倉庫到日常分支管理和與 GitHub 同步的全部核心操作。 Part 1: 初始配置 (一次性搞定) 在開始使用 Git 之前,需要先配置好你的電腦環境。(由于網絡的原因,直接使用https的方式拉取倉庫大概率是失敗的,故使用ssh的方…

文件系統-文件存儲空間管理

文件存儲空間管理的核心是空閑塊的組織、分配與回收,確保高效利用磁盤空間并快速響應文件操作(創建、刪除、擴展)。以下是三種主流方法:1. 空閑表法(連續分配)原理:類似內存動態分區&#xff0c…

python爬蟲實戰-小案例:爬取蘇寧易購的好評

一、項目背景與價值1 為什么爬取商品好評? 消費者洞察:分析用戶真實反饋,了解產品優缺點 市場研究:監測競品評價趨勢,優化產品策略二.實現代碼from selenium import webdriver from selenium.webdriver.edge.options i…

Spring Boot環境搭建與核心原理深度解析

一、開發環境準備 1.1 工具鏈選擇 JDK版本:推薦使用JDK 17(LTS版本),與Spring Boot 3.2.5完全兼容,支持虛擬線程等JDK 21特性可通過配置啟用構建工具:Maven 3.8.6(配置阿里云鏡像加速依賴下載…

Java自動拆箱機制

在黑馬點評項目中,提到了一個細節,就是Java的自動拆箱機制,本文來簡單了解一下。Java 的??自動拆箱機制(Unboxing)??是一種編譯器層面的語法糖,用于簡化??包裝類對象??(如 Integer、Boo…

哈希算法(Hash Algorithm)

哈希算法(Hash Algorithm)是一種將任意長度的數據映射為固定長度的哈希值(Hash Value)的算法,廣泛應用于密碼學、數據完整性驗證、數據結構(如哈希表)和數字簽名等領域。🧠 一、哈希…

黑馬點評使用Apifox進行接口測試(以導入更新店鋪為例、詳細圖解)

目錄 一、前言 二、手動完成接口測試所需配置 三、進行接口測試 一、前言 在學習黑馬點評P39實現商鋪緩存與數據庫的雙寫一致課程中,老師使用postman進行了更新店鋪的接口測試。由于課程是22年的,按照我從24年JavaWebAI課程所學習使用的Apifox內部其實…

Ubuntu 虛擬機配置 與Windows互傳文件

在VMware中為Ubuntu虛擬機設置共享文件夾 設置共享文件夾可以傳遞大量文件 在VMware的設置中打開共享文件夾功能,并設置共享文件夾的目錄。 點擊添加后,選擇一個電腦上的文件夾,這個文件夾最好是新建的空的。 完成后在“文件夾”列表中就…

機器學習對詞法分析、句法分析、淺層語義分析的積極影響

機器學習在自然語言處理的詞法、句法及淺層語義分析中產生了革命性影響,顯著提升了各任務的精度和效率。以下是具體影響及實例說明:??一、詞法分析??1. ??中文分詞????提升歧義消解能力??:傳統方法依賴規則或統計,但深…

初學者STM32—USART

一、簡介USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/異步收發器)是一種常見的串行通信協議,廣泛應用于微控制器、傳感器、模塊和其他電子設備之間的數據傳輸。本節課主要學習USART的基本結構以及其…

A316-V71-Game-V1:虛擬7.1游戲聲卡評估板技術解析

引言 隨著游戲產業的蓬勃發展,沉浸式音頻體驗成為提升游戲體驗的關鍵因素。本文將介紹一款專為游戲音頻設計的評估板——A316-V71-Game-V1,這是一款基于XMOS XU316技術的虛擬7.1游戲聲卡評估平臺。產品概述 A316-V71-Game-V1是一款專為虛擬7.1游戲聲卡設…

小白成長之路-部署Zabbix7

文章目錄一、概述二、案例三、第二臺虛擬機監控總結一、概述 二、案例 實驗開始前: systemctl disable --now firewalld setenforce 0 Rocky9.4部署Zabbix7 一、配置安裝源 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7.0-5.el…

飛書非正常顯示與權限問題解決方案

可能是本地緩存導致的,讓員工參考以下方法操作下:看不懂下面的建議刪除飛書再重新安裝;博主就遇到過版本低的原因,試過下面方面都不行。結果就是刪除重新安裝,博主是mac電腦。Windows 系統關閉飛書。如果不能關閉&…

第十八節:第八部分:java高級:動態代理設計模式介紹、準備工作、代碼實現

程序為什么需要代理以及代理長什么樣如何為java對象創建一個代理對象代碼: BigStar類 package com.itheima.day11_Proxy;public class BigStar implements Star {private String name;public BigStar(String name) {this.name name;}public String sing(String nam…

Grok網站的后端語言是php和Python2.7

老馬的Grok模型 https://grok.com/#subscribephp語法這里還出現了兩個bug后端語言能看到是php和python2.7要說卷還是得看中國的程序員啊,天天就是新技術,趕不上別人就35歲畢業退休

開發者的AI認知指南:用大模型重新理解人工智能(下)

第三篇 深度學習探索:神經網絡的奧秘解析 從手工特征工程到自動特征學習,深度學習為什么能讓AI"看懂"圖片、"聽懂"語音?讓我們用開發者的視角揭開神經網絡的神秘面紗。 深度學習的"代碼革命" 還記得我們在第二…

基于單片機智能消毒柜設計

傳送門 👉👉👉👉其他作品題目速選一覽表 👉👉👉👉其他作品題目功能速覽 概述 本設計實現了一種基于單片機的高效智能消毒柜系統,集精準滅菌、安全防護與能耗管理于…

什么是GCN?GCN與GNN有哪些區別?

文章目錄1. 什么是圖神經網絡(GNN)GNN通用計算框架2. 圖卷積網絡(GCN)詳解2.1 GCN核心公式2.2 GCN特點3. GCN與GNN的區別4. 如何選擇GCN或GNN5. 典型應用案例6. 代碼示例(PyTorch Geometric)7. 發展趨勢1. 什么是圖神經網絡(GNN) 圖神經網絡(Graph Neural Network, GNN)是一類…

【HarmonyOS】ArkUI - 聲明式開發范式

一、UI 開發框架 在 HarmonyOS 開發中,官方主要推出了兩種開發框架,一個是基于 Java 的,一個是基于 ArkTS 的。 基于 Java:應用中所有用戶界面元素都由基礎組件 Component 和組件容器 ComponentContainer 對象構成。基于 ArkTS&…

Python 繪制各類折線圖全指南:從基礎到進階

折線圖是數據可視化中最常用的圖表類型之一,適用于展示數據隨時間或有序類別變化的趨勢。無論是分析銷售額波動、溫度變化,還是對比多組數據的趨勢差異,折線圖都能直觀呈現數據的變化規律。本文將詳細介紹如何用 Python 的 Matplotlib、Seabo…