從零開始學習:深度學習(基礎入門版)(第2天)

(一)在pycharm軟件中,用python語言,opencv庫實現以下功能

(1.1)圖片的邊界填充

核心流程:
  1. 讀取原始圖像
    使用?cv2.imread()?加載名為?yueshan.png?的圖像文件

  2. 統一邊界參數
    設定四周留白尺寸均為?50px(上下左右各50像素)

  3. 五種邊界填充模式實驗
    對同一原始圖像執行以下操作,生成帶不同特性邊框的新圖像:

    • ?BORDER_CONSTANT: 用固定值?(22,25,8)(藍綠色)填充邊界
    • ?BORDER_REFLECT: 鏡像翻轉相鄰像素內容作為邊界
    • ?BORDER_REFLECT101: 奇偶對稱的特殊鏡像模式
    • ?BORDER_REPLICATE: 直接復制邊緣像素平鋪邊界
    • ?BORDER_WRAP: 將圖像視為周期信號循環延伸
  4. 可視化對比
    通過?cv2.imshow()?分窗口顯示原始圖像及五種邊界處理結果,按任意鍵逐幅查看

示例代碼:
# cv2.copyMakeBorder()是opencV庫中的一個函數,用于給圖像添加額外的邊界(padding)
# copyMakeBorder(src: umat, top: int, bottom: int, left: int, right: int, borderType: int, dst: umat /None = ... valve: cv2.typing.scalar = ...)
# 它有以下幾個參數:
# src:要擴充邊界的原始圖像。
# top,bottom,left,right:相應方向上的邊寬度。
# borderType:定義要添加邊框的類型,它可以是以下的一種:
# CV2.BORDER_CONSTANT:添加的邊界框像素值為常數(需要額外再給定一個參數)。
# CV2.BORDER_REFLECT:添加的邊框像素將是邊界元素的鏡面反射,類似于gfedchalabcdefgh|hgfedcba。(交界處也復制了)
# CV2.BORDER_REFLECT_101 或 CV2.BORDER_DEFAULT;和上面類似,但是有一些細微的不同,類似于gfedcblabcdefghlgfedcba (交接處刪除了)
# CV2.BORDER_REPLICATE:使用最邊界的像素值代替,類似于aaaaaalabcdefghlhhhhhhh# CV2.BORDER_WRAP:上下左右邊依次替換,cdefghlabcdefghlabcdefgimport cv2ys = cv2.imread('yueshan.png')
# ys = cv2.resize(ys, dsize=None, fx=0.5, fy=0.5)  # 圖片縮放
# ys = cv2.resize(ys, (640, 480))top, bottom, left, right = 50, 50, 50, 50constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(22, 25, 8))
reflect = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_WRAP)cv2.imshow('yuantu', ys)
cv2.waitKey(0)cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)cv2.imshow('REFLECT_101', reflect101)
cv2.waitKey(0)cv2.imshow('REPLICATE', replicate)
cv2.waitKey(0)cv2.imshow('WRAP', wrap)
cv2.waitKey(0)

ys:

constant:

reflect:

reflect101:

replicate:

wrap:

(1.2)圖片的圖像運算

核心功能:
  1. ?基礎加減法:直接對像素值進行數學運算(如全局加10)
  2. ?區域疊加:通過切片操作實現特定區域的圖像相加
  3. ?安全加法cv2.add()?自動處理像素溢出(超過255則置為255)
  4. ?加權融合cv2.addWeighted()?按比例混合兩張圖像并添加亮度偏移
示例代碼:
# 圖像加法運算
# 對于“+”號運算,當對圖像a、圖像b進行加法求和時,遵循以下規則:
#   當某位置像素相加得到的數值小于255時,該位置數值為兩圖像該位置像素相加之和;
#   當某位置像素相加得到的數值大于255時,該位置數值將截斷結果并將其減去256。
#   例如:相加后是260,實際是260-256=4
import cv2
a = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
c = a + 10                    # 圖像整體加10
cv2.imshow('yuantu', a)
cv2.imshow('a+10', c)
cv2.waitKey(0)# ROI 區域相加示例
c = a[50:450, 50:400] + b[50:450, 50:400]
cv2.imshow('a+b', c)
cv2.waitKey(0)# 對于 cv2.add 運算,當對圖像a、圖像b進行加法求和時,遵循以下規則:
#   當某位置像素相加得到的數值小于255時,該位置數值為兩圖像該位置像素相加之和;
#   當某位置像素相加得到的數值大于255時,該位置數值為255(飽和運算)。a = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
b = cv2.resize(b, dsize=(400, 400))
a = cv2.resize(a, dsize=(400, 400))
c = cv2.add(a, b)
cv2.imshow('a add b', c)
cv2.waitKey(0)
cv2.destroyAllWindows()# 圖像加權運算
# 在計算兩幅圖像的像素值之和時,將每幅圖像的權重考慮進來,公式為:
#   dst = src1 × α + src2 × β + γa = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
b = cv2.resize(b, dsize=(400, 400))
a = cv2.resize(a, dsize=(400, 400))c = cv2.addWeighted(a,0.5,b,0.5,10)  # γ=10 為亮度偏移
cv2.imshow('addWeighted', c)
cv2.waitKey(0)
cv2.destroyAllWindows()

yuantu :

a+10:

a+b:

a add b:

addWeighted:

(1.3)圖片的閾值處理

核心功能:
1.讀入灰度圖
image = cv2.imread('mimi1.jpg', cv2.IMREAD_GRAYSCALE)  # 讀入灰度圖

作用:加載一張只有亮度信息的灰度照片(像素值范圍0~255)
相當于:把彩色照片去掉顏色,只留下明暗層次

2.閾值處理類型對照表

所有方法共用同一組參數:threshold=175,?maxval=255
(即:"以175為分界線,最高允許到255")

方法名稱英文標識行為規則效果圖特征
標準二值化cv2.THRESH_BINARY?≥175 → 純白(255)
<175 → 純黑(0)
黑白分明,像木刻版畫
反向二值化cv2.THRESH_BINARY_INV?≥175 → 純黑(0)
<175 → 純白(255)
陰陽顛倒,亮處變暗,暗處變亮
截斷處理cv2.THRESH_TRUNC?≥175 → 強制設為175
<175 → 保持原樣
過曝區域集體降亮度,畫面偏灰蒙蒙
低區歸零cv2.THRESH_TOZERO?≥175 → 保持原樣
<175 → 強制設為0(純黑)
暗部全黑,亮部保留漸變
高區歸零cv2.THRESH_TOZERO_INV?<175 → 保持原樣
≥175 → 強制設為0(純黑)
亮部全黑,暗部保留漸變
示例代碼:
#閾值處理
import cv2# 讀取灰度圖
image = cv2.imread('mimi1.jpg', cv2.IMREAD_GRAYSCALE)# 閾值處理
ret, binary      = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY)
ret1, binaryinv  = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY_INV)
ret2, trunc      = cv2.threshold(image, 175, 255, cv2.THRESH_TRUNC)
ret3, tozero     = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO)
ret4, tozeroinv  = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO_INV)# 顯示結果
cv2.imshow('gray', image)
cv2.waitKey(0)cv2.imshow('binary', binary)        # 偏白的變純白,偏黑的變純黑
cv2.waitKey(0)cv2.imshow('binaryinv', binaryinv)  # 偏白的變純黑,偏黑的變純白
cv2.waitKey(0)cv2.imshow('trunc', trunc)          # 白色變得一樣灰蒙蒙,偏黑的不變
cv2.waitKey(0)cv2.imshow('tozero', tozero)        # 偏白色不變,偏黑的就變純黑
cv2.waitKey(0)cv2.imshow('tozeroinv', tozeroinv)  # 偏白色變純黑,偏黑的不變
cv2.waitKey(0)cv2.destroyAllWindows()

gray:

binary:

binaryinv:

trunc:

tozero:

tozeroinv:

(1.4)圖片的圖像平滑處理

關鍵函數總結:
濾波方法函數名關鍵參數特點
均值濾波cv2.blur(src, ksize)簡單平均,模糊均勻
方框濾波cv2.boxFilter(src, ddepth, ksize, normalize)可控制是否歸一化
高斯濾波cv2.GaussianBlur(src, ksize, sigmaX)保留邊緣,模糊更自然
中值濾波cv2.medianBlur(src, ksize)去噪強,保留邊緣
示例代碼:
import cv2
import numpy as npdef add_peppersalt_noise(image, n=10000):result = image.copy()h, w = image.shape[:2]for i in range(n):x = np.random.randint(1, h)y = np.random.randint(1, w)if np.random.randint(0, 2) == 0:result[x, y] = 0else:result[x, y] = 255return result# 讀取并顯示原圖
image = cv2.imread('zl.png')
cv2.imshow('yntu', image)
cv2.waitKey(0)# 添加噪聲并顯示
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
# 3x3核(輕度模糊)
blur_1 = cv2.blur(noise, (3, 3))
cv2.imshow('blur_1', blur_1)
cv2.waitKey(0)# 63x63核(重度模糊)
blur_2 = cv2.blur(noise, (63, 63))
cv2.imshow('blur_2', blur_2)
cv2.waitKey(0)# 歸一化(效果同均值濾波)
boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
cv2.imshow('boxFilter_1', boxFilter_1)
cv2.waitKey(0)# 不歸一化(像素值可能溢出為255)
boxFilter_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)
cv2.imshow('boxFilter_2', boxFilter_2)
cv2.waitKey(0)# 高斯濾波:3x3核,sigmaX=1
GaussianB = cv2.GaussianBlur(noise, (3, 3), sigmaX=1)
cv2.imshow('GaussianBlur', GaussianB)
cv2.waitKey(0)# 中值濾波:3x3核
medianB = cv2.medianBlur(noise, 3)
cv2.imshow('medianBlur', medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

yutu:

noise:

blur_1:

blur_2:

boxFilter_1:

boxFilter_2:

GaussianBlur:

medianBlur:

(二)實戰項目案例

項目內容:

核心步驟和功能:

1. 打開視頻流?
? ?cap = cv2.VideoCapture('test.avi')??
→ 把硬盤里的視頻文件變成一幀一幀的圖像流,供后續逐幀處理

2. 逐幀讀取??
?ret, frame = cap.read()??
→ 每次循環拿到一幀原始圖像(BGR 格式)

3. 加椒鹽噪聲??
?noisy = add_peppersalt_noise(frame, 10000)??
→ 在這幀上隨機撒 10000 個黑白點,模擬真實噪聲

4. 去噪處理
? ?denoised = cv2.medianBlur(noisy, 3)?
→ 用 3×3 中值濾波去掉椒鹽噪聲,同時盡量保留畫面細節

5.三窗口同步顯示?
?- cv2.imshow('Original Video', frame)?
- cv2.imshow('Noisy Video', noisy)??
- cv2.imshow('Denoised Video', denoised)??
→ 實時對比“原圖 / 有噪圖 / 去噪圖”

6. 按 q 退出?
? ?if cv2.waitKey(30) & 0xFF == ord('q'): break??
→ 用戶隨時按 q 鍵即可結束播放

7. 資源釋放?
? ?cap.release(); cv2.destroyAllWindows()
→ 關閉攝像頭或文件句柄,釋放內存,銷毀所有窗口

代碼實現和效果:

import cv2
import numpy as np# 1. 添加椒鹽噪聲函數(復用)
def add_peppersalt_noise(image, n=10000):result = image.copy()h, w = image.shape[:2]for i in range(n):x = np.random.randint(1, h)y = np.random.randint(1, w)if np.random.randint(0, 2) == 0:result[x, y] = 0else:result[x, y] = 255return result# 2. 打開視頻文件
cap = cv2.VideoCapture('test.avi')# 檢查視頻是否成功打開
if not cap.isOpened():print("無法打開視頻文件,請檢查路徑!")exit()# 3. 逐幀處理
while True:ret, frame = cap.read()if not ret:break# 添加噪聲noisy_frame = add_peppersalt_noise(frame, 10000)# 中值濾波去噪(保留邊緣,適合椒鹽噪聲)denoised_frame = cv2.medianBlur(noisy_frame, 3)# 顯示三個窗口cv2.imshow('Original Video', frame)cv2.imshow('Noisy Video', noisy_frame)cv2.imshow('Denoised Video', denoised_frame)# 按 'q' 鍵退出if cv2.waitKey(30) & 0xFF == ord('q'):break# 4. 釋放資源
cap.release()
cv2.destroyAllWindows()

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

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

相關文章

HTTP協議-3-HTTP/2是如何維持長連接的?

先說結論&#xff1a;HTTP/2的“長連接” 一個TCP連接 多路復用 二進制幀 流控制 持久會話管理 它不只是“連接不斷”&#xff0c;更關鍵的是&#xff1a;在這個長連接上&#xff0c;可以同時并發傳輸成百上千個請求和響應&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

圖解希爾排序C語言實現

1 希爾排序 希爾排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出來的一種排序算法&#xff0c;在這之前排序算法的時間復雜度基本都是O(n)&#xff0c;希爾排序算法是突破這個時間復雜度的第一批算法之一。 1.1 基本概念與原理 希爾排序通過將原始列表分割成若…

網絡協議——HTTPS協議

目錄 一、HTTPS是什么 加密是什么 二、HTTPS的工作過程 &#xff08;一&#xff09;對稱加密 &#xff08;二&#xff09;非對稱加密 &#xff08;三&#xff09;在非對稱加密的基礎上&#xff0c;引入證書校驗 證書是什么 證書的內容 用證書解決中間人攻擊 三、總結 …

React 基礎實戰:從組件到案例全解析

React 基礎實戰專欄:從組件到案例全解析 本專欄圍繞 React 核心概念(組件、Props、State、生命周期)展開,通過 6個實戰案例+核心知識點拆解,幫你掌握 React 基礎開發邏輯,每篇聚焦1個實戰場景,搭配完整代碼與原理講解,適合 React 入門者鞏固基礎。 專欄目錄 【組件傳…

ARM芯片架構之CoreSight Channel Interface 介紹

CoreSight Channel Interface&#xff08;通道接口&#xff09;詳解1. 概述 Channel Interface 是 ARM CoreSight 架構中用于在不同組件之間傳遞觸發事件的專用接口。它是 Event Interface 的增強版本&#xff0c;支持多通道、雙向通信&#xff0c;以及同步與異步兩種時鐘域連接…

Blender模擬結構光3D Scanner(二)投影儀內參數匹配

關于投影儀外參的設置可參見前一篇文章 Blender模擬結構光3D Scanner&#xff08;一&#xff09;外參數匹配-CSDN博客 使用Projectors插件模擬投影儀 Step 1 在Github下載插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下載zip壓縮包即可&#xff0c;無…

synchronized的作用

目錄 一、核心作用 二、實現原理&#xff1a;基于"對象鎖" 三、使用方式 四、鎖的優化 五、優缺點 六、總結 synchronized 是 Java 中用于解決多線程并發安全問題的核心關鍵字&#xff0c;它的主要作用是實現線程間的同步&#xff0c;確保多個線程在訪問共享資…

機試備考筆記 14/31

2025年8月14日 小結&#xff1a;&#xff08;17號整理14號的筆記&#xff0c;這輩子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好媽媽在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只學了10分鐘嘻嘻 目錄LeetCode22…

dolphinscheduler中任務輸出變量的問題出現ArrayIndexOutOfBoundsException

一段腳本任務如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——邊界填充、閾值處理

目錄 一、邊界填充&#xff08;Border Padding&#xff09; 1. 常見填充類型及效果 2.代碼示例 &#xff08;1&#xff09;constant邊界填充&#xff0c;填充指定寬度的像素 &#xff08;2&#xff09;REFLECT鏡像邊界填充 &#xff08;3&#xff09;REFLECT_101鏡像邊界…

Leetcode 15 java

今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 輸入&#xff1a;root [2…

嵌入式學習的第四十九天-時鐘+EPIT+GPT定時器

一、時鐘1.時鐘系統基本概念&#xff08;1&#xff09;PLL (鎖相環, Phase-Locked Loop)作用&#xff1a;PLL是一種反饋控制電路&#xff0c;用于生成穩定的高頻時鐘信號。它通過將輸出時鐘與參考時鐘進行比較和調整&#xff0c;可以產生比輸入參考時鐘頻率高得多的輸出時鐘。倍…

Python Sqlalchemy數據庫連接

Python Sqlalchemy數據庫連接一、連接數據二、模型三、ORM操作一、連接數據 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 連接數據庫 dbHost postgres://用戶名:密碼主機:端口/數據庫名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript標準 以及 npm安裝

目錄 一、 ECMAScript標準 - 默認導出和導入 二、ECMAScript標準 - 命名導出和導入 三、包的概念 五、 npm - 安裝所有依賴 六、 npm - 全局軟件包 Node.js總結 總結不易~ 本章節對我有很大的收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本節素材…

NPM 、 NPX

NPM vs. NPX 簡單來說&#xff0c;npm 是一個 node 包管理器&#xff0c;npx 是一個 Node 包執行器。 NPX 是一個 Node 包執行器&#xff0c;該 Node 包可以是本地也可以是遠程的。允許開發者在無需安裝的情況下執行任意 Node 包。npm 在安裝nodejs 就自動帶了 npm install -g …

守護品質安全,防偽溯源系統打造全鏈路信任體系

一、引言在當下這個信息透明、品質至上的時代&#xff0c;防偽溯源已經成為眾多品牌保護自身利益、提升消費者信任度的重要手段。為了滿足市場上對高效、可靠的防偽溯源查詢系統的迫切需求&#xff0c;榕壹云精心打造了一款防偽溯源查詢系統。二、項目背景隨著商品市場的不斷擴…

【完整源碼+數據集+部署教程】無人機航拍視角洪水檢測與受災房屋識別圖像分割救援指導系統源碼和數據集:改進yolo11-DCNV2

背景意義 研究背景與意義 隨著全球氣候變化的加劇&#xff0c;極端天氣事件的頻率和強度不斷上升&#xff0c;洪水作為一種常見的自然災害&#xff0c;給人類社會帶來了嚴重的威脅。洪水不僅導致人員傷亡和財產損失&#xff0c;還對基礎設施和生態環境造成了深遠的影響。因此&a…

C# 結構體與類的區別是什么?

結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。 類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量…

Redis GEO

Redis GEO 引言 Redis 是一款高性能的鍵值存儲系統,廣泛應用于緩存、消息隊列等領域。Redis GEO 是 Redis 2.4 版本后新增的一個功能,用于存儲地理位置信息。本文將詳細介紹 Redis GEO 的概念、使用方法以及應用場景。 什么是 Redis GEO? Redis GEO 是 Redis 的一個模塊…

Go從入門到精通系列學習路線規劃

Go從入門到精通系列學習路線規劃 目錄導航 Go從入門到精通系列學習路線規劃首頁說明 第1篇_Go語言初探_環境搭建與HelloWorld 第2篇_Go語言基礎語法_變量常量與數據類型 第3篇_Go語言控制結構_條件判斷與循環 第4篇_Go語言函數詳解 第5篇_Go語言數據結構詳解 第6篇_Go語言結構體…