OpenCV圖像處理2:邊界填充與平滑濾波實戰

前面學了一些關于opencv圖像處理的內容,現在繼續。

一 圖像填充

????????邊界填充(Border Padding)?,即在圖像四周添加指定寬度的像素區域。其核心函數是cv2.copyMakeBorder(),通過不同的填充方式(borderType)處理圖像邊緣,常用于避免卷積操作(如濾波)時邊界信息丟失調整圖像尺寸。有下面四種參數

  1. 黑色邊框?(常數填充)BORDER_CONSTANT?
  2. ?鏡像反射含邊緣?(如照鏡子)??BORDER_REFLECT
  3. ?鏡像反射不含邊緣?(更平滑)?BORDER_REFLECT_101
  4. ?拉伸邊緣像素?(復制最外側像素)?BORDER_REPLICATE
  5. ?循環平鋪圖像?(類似紋理重復)BORDER_WRAP

代碼部分

1?常數填充

這里top,bottom,left,right=50,50,50,50,表示要向上下左右要填充的大小,這里填充的是黑色,RGB值為0,0,0。如果是填充其他值可以修改。

zxc=cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
constant=cv2.copyMakeBorder(zxc, top, bottom, left, right,borderType=cv2.BORDER_CONSTANT,value=(0,0,0))
cv2.imshow('zxc',zxc)
cv2.imshow('constant',constant)
cv2.waitKey(0)

2 邊緣折射填充

?BORDER_REFLECT和?BORDER_REFLECT101方法差不多,但通過圖我們可以看出來,第一種邊緣部分有點點突兀,而第二種就比較平滑。

import cv2zxc=cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
reflact=cv2.copyMakeBorder(zxc,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflact101=cv2.copyMakeBorder(zxc,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
cv2.imshow('zxc',zxc)
cv2.imshow('constant',reflact)
cv2.imshow('reflect',reflact101)
cv2.waitKey(0)

3 拉伸填充

import cv2zxc=cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
replicate=cv2.copyMakeBorder(zxc,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
cv2.imshow('zxc',zxc)
cv2.imshow('constant',replicate)
cv2.waitKey(0)

4 循環平鋪填充

import cv2zxc=cv2.imread('img.png')
top,bottom,left,right=50,50,50,50
cv2.imshow('zxc',zxc)
wrap=cv2.copyMakeBorder(zxc,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow('reflect',wrap)
cv2.waitKey(0)

二?圖像加運算

第一篇文章也說了,opencv把圖片轉化為了一個一個 像素值,那么就可以進行加,這里有兩種方法,一個是直接加,一個是用add方法。注意這里相加,要尺寸大小一樣才能相加。

1 直接加

對兩張圖像每個像素值直接相加(例:像素A(150) + 像素B(120) = 270 → 截斷為255)

import cv2long=cv2.imread('img_3.png')
tu=cv2.imread('img_5.png')
long=cv2.resize(long,(800,600))
tu=cv2.resize(tu,(800,600))
c=long+tu
cv2.imshow('long',long)
cv2.imshow('tu',tu)
cv2.imshow('aa',c)
cv2.waitKey(0)

2?cv2.addWeighted加權相加

這種更平滑,不會有出現超過255像素值的那種情況

import cv2long=cv2.imread('img_3.png')
tu=cv2.imread('img_5.png')
long=cv2.resize(long,(800,600))
tu=cv2.resize(tu,(800,600))
d=cv2.addWeighted(long,0.5,tu,0.5,0)cv2.imshow('bb',d)
cv2.waitKey(0)

三 閾值處理

閾值處理就是對圖片像素值設定一個閾值,大于這個就是就設置為其他像素或怎么的,下面看代碼詳解。

?閾值化選項??條件:像素值 > thresh??條件:像素值 ≤ thresh?
cv2.THRESH_BINARY設置為?maxval設置為?0
cv2.THRESH_BINARY_INV設置為?0設置為?maxval
cv2.THRESH_TRUNC截斷為?thresh保持原始灰度值不變
cv2.THRESH_TOZERO保持原始灰度值不變設置為?0
cv2.THRESH_TOZERO_INV設置為?0保持原始灰度值不變

1?cv2.THRESH_BINARY

這里還先對圖像作了灰度圖處理,有利于對閾值操作。這里閾值處理后會返回兩個值,一個是閾值,另一個就是處理好的圖像。具體原理看上方表格

import cv2a=cv2.imread('img_2.png',0)
a=cv2.resize(a,(800,600))
_,binary=cv2.threshold(a,170,255,cv2.THRESH_BINARY)cv2.imshow('a',a)
cv2.imshow('binary',binary)
cv2.waitKey(0)

2?cv2.THRESH_BINARY_INV

這個就是上面的一個后面加了INV,其實就是上面處理好的圖中,黑色變白色,白色變黑色,反轉了一下。

import cv2a=cv2.imread('img_2.png',0)
a=cv2.resize(a,(800,600))
_,binaryinv=cv2.threshold(a,170,255,cv2.THRESH_BINARY_INV)cv2.imshow('a',a)
cv2.imshow('binary',binaryinv)
cv2.waitKey(0)

3?cv2.THRESH_TRUNC

這里設定的閾值為170,然后超過的就記作170,低于的就按照原像素值1

import cv2a=cv2.imread('img_2.png',0)
a=cv2.resize(a,(800,600))
_,trunc=cv2.threshold(a,170,255,cv2.THRESH_TRUNC)cv2.imshow('a',a)
cv2.imshow('binary',trunc)
cv2.waitKey(0)

4THRESH_TOZERO和THRESH_TOZERO_INV

保持原始灰度值不變設置為?0
設置為?0保持原始灰度值不變
import cv2a=cv2.imread('img_2.png',0)
a=cv2.resize(a,(800,600))
_,tozero=cv2.threshold(a,170,255,cv2.THRESH_TOZERO)
_,tozeroinv=cv2.threshold(a,170,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('a',a)
cv2.imshow('binary',tozero)
cv2.imshow('binaryinv',tozeroinv)
cv2.waitKey(0)

五?圖像平滑處理

這里有四種常用圖像濾波方法可以進行圖像平滑處理

下面我先對圖片加上椒鹽噪聲。

1. ?均值濾波 (Mean Filtering)??

?原理?:
對圖像中每個像素點,取其鄰域內(如3×3、5×5)所有像素的算術平均值作為該點的新值。

import random
import cv2def zs(src,n):c=src.copy()print(c.shape)for i in range(n):x=random.randint(1,c.shape[0]-1)y=random.randint(1,c.shape[1]-1)if random.randint(0,1) == 0:c[x,y]=255else:c[x,y]=0return ctu=cv2.imread('img_5.png')
ntu=zs(tu,10000)
jz=cv2.blur(ntu,(3,3))
cv2.imshow('tu',tu)
cv2.imshow('ntu',ntu)
cv2.imshow('jz',jz)
cv2.waitKey(0)

我們先定義了一個函數,對圖像添加了椒鹽噪聲,然后進行了均值濾波處理

這里處理結果顯然不是很好.

2 高斯濾波 (Gaussian Filtering)??

?原理?:
對鄰域內像素進行加權平均,權重由二維高斯函數生成,距離中心點越近權重越大

import random
import cv2def zs(src,n):c=src.copy()print(c.shape)for i in range(n):x=random.randint(1,c.shape[0]-1)y=random.randint(1,c.shape[1]-1)if random.randint(0,1) == 0:c[x,y]=255else:c[x,y]=0return ctu=cv2.imread('img_5.png')
ntu=zs(tu,10000)
jz=cv2.blur(ntu,(3,3))
gs=cv2.GaussianBlur(ntu,(3,3),0)
cv2.imshow('tu',tu)
cv2.imshow('ntu',ntu)
cv2.imshow('gs',gs)
cv2.waitKey(0)

3 方框濾波

  1. 核心計算邏輯?

    • 對圖像中每個像素的?3×3?鄰域內所有像素值直接求和,?不進行歸一化?(即不除以像素數量?9)。
    • 數學表達:output(x,y)=i=?1∑1?j=?1∑1?input(x+i,y+j)
  2. ?與歸一化方框濾波的區別?

    • ?歸一化模式?(normalize=True):
      等價于均值濾波(cv2.blur()),輸出鄰域像素平均值,結果平滑但保留亮度范圍。
    • ?非歸一化模式?(normalize=False):
      輸出為鄰域像素值之和,結果常因數值溢出呈現 ?全白或高亮區域?。
import random
import cv2def zs(src,n):c=src.copy()print(c.shape)for i in range(n):x=random.randint(1,c.shape[0]-1)y=random.randint(1,c.shape[1]-1)if random.randint(0,1) == 0:c[x,y]=255else:c[x,y]=0return ctu=cv2.imread('img_5.png')
ntu=zs(tu,10000)
jz=cv2.blur(ntu,(3,3))
fk1=cv2.boxFilter(ntu,-1,ksize=(3,3),normalize=True)
fk2=cv2.boxFilter(ntu,-1,ksize=(3,3),normalize=False)cv2.imshow('tu',tu)
cv2.imshow('ntu',ntu)
cv2.imshow('fk1',fk1)
cv2.imshow('fk2',fk2)
cv2.waitKey(0)

下面的第一張圖我沒有加歸一化,這樣的話就好第一種方法均值濾波差不多了。但加完之后圖片就太模糊了。

4?中值濾波 (Median Filtering)??

?原理?:
取鄰域內所有像素值的中位數替代中心像素值。
?計算步驟?:

  1. 提取鄰域像素值
  2. 排序后取中間位置的值

?適用場景?:

  • 高效去除椒鹽噪聲?(黑白點狀噪聲)
  • 需保留銳利邊緣的場景
    ?特點?:
  • ? 完全消除孤立噪聲點
  • ? 邊緣保護能力極強
  • ? 計算開銷較大(需排序)
import random
import cv2def zs(src,n):c=src.copy()print(c.shape)for i in range(n):x=random.randint(1,c.shape[0]-1)y=random.randint(1,c.shape[1]-1)if random.randint(0,1) == 0:c[x,y]=255else:c[x,y]=0return ctu=cv2.imread('img_5.png')
ntu=zs(tu,10000)
jz=cv2.blur(ntu,(3,3))
zz=cv2.medianBlur(ntu,5)
cv2.imshow('tu',tu)
cv2.imshow('ntu',ntu)
cv2.imshow('zz',zz)
cv2.waitKey(0)

從結果上看,這種方法對處理椒鹽噪聲是特別好的。

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

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

相關文章

imx6ull-驅動開發篇22——Linux 時間管理和內核定時器

目錄 內核時間管理 系統節拍率 高/低節拍率的優缺點 jiffies 節拍數 時間繞回 時間轉換函數 內核定時器 timer_list 結構體 定時器API函數 init_timer 函數 add_timer 函數 del_timer 函數 del_timer_sync 函數 mod_timer 函數 Linux 內核短延時函數 內核時間管…

路由器數據控制管理層面安全

數據層面:FPM Flexible Packet MatchingFPM是CisCOIOS新一代的ACL根據任意條件,無無狀態的匹配數據包的頭部負載,或者全部分析協議,更易于規則的創建用于替代傳統ACL,對特定惡意流量的基礎架構過濾無狀態ipv4單播不支持…

Vue內置組件全解析:從入門到面試通關

文章目錄Vue內置組件全解析&#xff1a;從入門到面試通關引言&#xff1a;為什么需要內置組件&#xff1f;一、Vue內置組件全景圖二、核心內置組件詳解1. <component> - 動態組件2. <transition> - 過渡動畫3. <keep-alive> - 組件緩存4. <slot> - 內容…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-會議記錄

在當今快節奏的工作環境中&#xff0c;會議記錄是每個職場人士都必須要面對的任務。傳統的手動記錄方式不僅效率低下&#xff0c;而且容易遺漏重要信息。隨著Web技術的發展&#xff0c;基于瀏覽器的實時語音轉寫技術為會議記錄提供了全新的解決方案。本文將詳細介紹如何利用Web…

WEB3——水龍頭,如何獲得開發用的測試幣、 Sepolia 測試幣?

注意&#xff1a; 有些水龍頭渠道&#xff0c;要求以太坊幣至少有0.01ETH,設有這個門檻&#xff0c;下面并不是所有渠道都能領取到測試幣&#xff0c;有些可能對領取測試幣有要求&#xff0c;如果想獲得獲取以太坊幣的方法&#xff0c;可以看我其他的文章。 本文整理了多個免費…

C++調試革命:時間旅行調試實戰指南

還在為C的懸垂指針、內存泄漏和并發競態抓狂&#xff1f;讓調試器學會“時光倒流” 凌晨三點&#xff0c;std::thread創建的六個線程中有一個突然吞掉了你的數據&#xff0c;valgrind只告訴你“Invalid read”&#xff0c;而時間旅行調試&#xff08;TTD&#xff09;?? 能讓你…

mysql8.0筆記

1.DDL數據定義語言 DDL是什么——————創建、修改、刪除 數據庫和表結構的命令。 基本語法 針對數據庫的操作 -- 創建數據庫 CREATE DATABASE 數據庫名; -- 比如 CREATE DATABASE myschool; --查看所有數據庫 SHOW DATABASES; --使用某個數據庫 USE myschool; -- 刪除數據庫…

大模型微調【1】之入門

文章目錄說明一 大模型微調技術1.1 微調基礎1.2 量化概念1.3 高效微調方法LoRA&QLoRA1.4 LoRA VS QLoRA1.5 高效微調的應用場景二 主流微調工具2.1 unsloth2.2 LLama-Factory2.3 ms-SWIFT2.4 ColossalAI2.5 底層微調框架推薦2.6 模型性能評估框架EvalScope三 微調所需軟硬件…

深入解析Linux poll()系統調用

&#x1f504; Linux poll() 系統調用詳解一、poll 是干什么的&#xff1f;poll 是 Linux&#xff08;及 POSIX 標準&#xff09;中用于實現 I/O 多路復用&#xff08;I/O Multiplexing&#xff09; 的系統調用&#xff0c;它的核心作用是&#xff1a;讓一個線程能夠同時監視多…

文獻閱讀 | PLoS ONE | SRplot:一個免費的在線平臺,用于數據可視化和圖形

文獻介紹文獻題目&#xff1a; SRplot&#xff1a;一個免費的在線平臺&#xff0c;用于數據可視化和圖形 研究團隊&#xff1a; Yewei Wang&#xff08;中南大學湘雅二醫院&#xff09; 發表時間&#xff1a; 2023-11-09 發表期刊&#xff1a; PLoS ONE 影響因子&#xff1a; 3…

分布式與微服務寶典

分布式理論基礎 1、分布式架構有哪些特點&#xff0c;優勢和缺陷 特點&#xff1a;微服務架構的優點微服務架構的缺陷自由使用不同技術增加故障排除挑戰每一個微服務都側重于單一功能由于遠程調用增加延遲支持單個可部署單元增加了配置與其他操作的工作量允許經常發布軟件難以保…

利用生成式AI與大語言模型(LLM)革新自動化軟件測試 —— 測試工程師必讀深度解析

引言 自動化測試是現代軟件工程的基石&#xff0c;然而&#xff0c;隨著軟件復雜度和迭代速度的飛速提升&#xff0c;傳統自動化測試方法正面臨越來越多的挑戰。 近年來&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;和大語言模型&#xff08;LLM&#xff0…

JS 與 C++ 雙向通信實戰:基于 WebHostViewListener 的消息處理機制

前言在現代瀏覽器和桌面應用開發中&#xff0c;WebView 嵌入已經成為一種非常常見的 UI 技術方案。無論是基于 Chromium 的 CEF&#xff08;Chromium Embedded Framework&#xff09;、Qt WebEngine&#xff0c;還是自研瀏覽器內核&#xff0c;嵌入 WebView 都能帶來極高的靈活…

模板打印技術——Office XLS 打印模板:為政務土地確權定制的紙張替換利器—仙盟創夢IDE

代碼public static int cyberwin_replaceExcelandoutputPrint(string fisrcpathleurl, DataTable dtInfo, string despath){if (File.Exists(despath) true){//刪除目標文件File.Delete(despath);}File.Copy(fisrcpathleurl, despath);string 目標文件 despath;MSEXCEL.Appli…

可直接運行的 Playwright C# 自動化模板

目錄 目錄結構 1. appsettings.json&#xff08;賬號、URL、路徑配置&#xff09; 2. Program.cs&#xff08;啟動入口&#xff09; 3. SchedulerConfig.cs&#xff08;定時調度&#xff09; 4. SocialSecurityTask.cs&#xff08;自動報社保任務&#xff09; 5. QuerySo…

云平臺監控-云原生環境Prometheus企業級監控實戰

目錄 一、基于 Kubernetes 的 Prometheus 監控方案概述 1. 核心組件及功能 2. 監控流程詳解 3. 關鍵監控指標說明 二、Prometheus 與相關組件部署 1. 克隆項目代碼 2. 安裝 Prometheus Operator 3. 安裝 Prometheus Stack 4. 查看容器運行狀態 三、ServiceMonitor 配…

GPT-5 有點不太順

GPT-5 有點不太順 OpenAI 的新模型 GPT-5 盼了很久,結果一上線就問題不少。 發布會剛過,CEO 山姆?奧特曼就說,要給部分用戶恢復 GPT-4o 這些老模型的使用權限,還承認 GPT-5 上線 “比預想的坎坷”。 簡單題都做錯了 不少用戶發現,GPT-5 連一些簡單問題都答不對,比之前…

《卷積神經網絡(CNN):解鎖視覺與多模態任務的深度學習核心》

1.概述卷積神經網絡&#xff08;CNN&#xff09;是深度學習在計算機視覺領域的重要突破&#xff0c;專為處理網格狀數據&#xff08;如圖像&#xff09;設計&#xff0c;后也擴展到自然語言處理等領域。它解決了全連接網絡處理大圖像時計算代價高、特征保留差的問題&#xff0c…

React Native + Expo搭建APP項目+安卓模擬器

Expo 嘗試一下就好&#xff0c;畢竟參考代碼太少&#xff0c;相當于閉關造輪子&#xff0c;不建議。 一、需要的工具 1. node.js&#xff0c;推薦使用&#xff08;TLS版本&#xff09;&#xff0c;版本不是太低就行&#xff0c;測試用的v20.12.2的Node 2. 開發工具 VS CODE或…

第六十五章:AI的“精良食材”:圖像標注、視頻幀抽幀與字幕提取技巧

ai 數據處理前言&#xff1a;從“原始食材”到“AI盛宴”第一章&#xff1a;圖像標注&#xff1a;為AI“指點江山”1.1 什么是圖像標注&#xff1f;—— AI的“視覺標簽”1.2 分類任務&#xff1a;圖像的“身份識別”1.3 目標檢測&#xff1a;圖像的“區域識別”與“邊界框”1.…