python-圖片分割

圖片分割是圖像處理中的一個重要任務,它的目標是將圖像劃分為多個區域或者對象,例如分割出物體、前景背景或特定的部分。在 Python 中,常用的圖片分割方法包括傳統的圖像處理技術(例如閾值分割、區域生長等)和深度學習技術(例如基于預訓練模型的語義分割或實例分割)。以下是詳細介紹和示例代碼:

1. 基于傳統圖像處理的分割方法
(1) 使用固定閾值分割圖片
使用 OpenCV 的閾值處理來將前景和背景分離。適合簡單的二值圖像。

import cv2
import numpy as np
# 加載圖片
image = cv2.imread('image.jpg', 0)  # 以灰度加載圖片
# 應用二值化閾值分割
_, binary = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)# 顯示分割結果
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

參數說明:
128 是閾值,低于此值的像素設置為 0,高于閾值的設置為 255。
cv2.THRESH_BINARY 是二值化模式。

(2) 自適應閾值分割
適合光照不均的情況,使用局部區域的像素值計算閾值。

import cv2# 加載圖片
image = cv2.imread('image.jpg', 0)
# 自適應閾值分割
binary_adaptive = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)
# 顯示分割結果
cv2.imshow('Adaptive Threshold', binary_adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()

參數說明:
cv2.ADAPTIVE_THRESH_GAUSSIAN_C 使用高斯加權的鄰域計算閾值。
11 是鄰域大小。
2 是閾值偏移。

(3) 使用圖像邊緣檢測分割
通過檢測圖像的邊緣將不同的區域分離。

import cv2# 加載圖片
image = cv2.imread('image.jpg', 0)
# 使用Canny邊緣檢測
edges = cv2.Canny(image, 100, 200)
# 顯示邊緣分割結果
cv2.imshow('Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

參數說明:
100 是低閾值,200 是高閾值,用于檢測邊緣。

(4) 基于 K-Means 的聚類分割
可以將圖像的顏色或亮度聚類為K個類別,適合彩色圖像分割。

import cv2
import numpy as np# 加載圖片
image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Z = image.reshape((-1, 3))  # 將圖像從二維展開為一維# 使用 K-Means 聚類
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 3  # 聚類數
_, labels, centers = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# 將聚類結果映射回圖像
centers = np.uint8(centers)
segmented_image = centers[labels.flatten()]
segmented_image = segmented_image.reshape(image.shape)
# 顯示分割結果
import matplotlib.pyplot as plt
plt.imshow(segmented_image)
plt.show()

參數說明:
K 是分割的顏色聚類數,譬如設置為3會將圖像分割成3種顏色區域。

2. 深度學習分割方法
對于復雜分割任務,深度學習可以提供更高的精度。典型方法包括使用預訓練的分割模型(如 DeepLab、Mask R-CNN 等)。

(1) 使用 OpenCV DNN 模塊加載預訓練的 DeepLabV3+ 模型
DeepLabV3+ 是一種流行的語義分割模型。

import cv2
import numpy as np# 加載 DeepLabV3+ 模型
net = cv2.dnn.readNetFromTensorflow('deeplabv3.pb')# 加載圖像
image = cv2.imread('image.jpg')
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0/255, size=(513, 513),mean=(127.5, 127.5, 127.5), swapRB=True, crop=False)# 推理
net.setInput(blob)
output = net.forward()
# 解析結果
segmentation_map = np.argmax(output[0], axis=0)
# 顯示分割結果
segmentation_map = cv2.resize(segmentation_map.astype(np.uint8), (image.shape[1], image.shape[0]))
cv2.imshow("Segmentation Map", segmentation_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

(2) 使用 PyTorch 或 TensorFlow 加載分割模型
如果需要靈活的操作,可以使用深度學習框架加載分割模型進行推理。

import torch
from torchvision import models
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt# 加載預訓練的 DeepLabV3 模型
model = models.segmentation.deeplabv3_resnet101(pretrained=True)
model.eval()
# 加載圖片并預處理
image = Image.open("image.jpg")
transform = transforms.Compose([transforms.ToTensor(),transforms.Resize((520, 520)),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
input_image = transform(image).unsqueeze(0)
# 推理
output = model(input_image)['out'][0]
segmentation_map = torch.argmax(output, dim=0).numpy()
# 顯示分割結果
plt.imshow(segmentation_map)
plt.show()

cv2.threshold(), cv2.adaptiveThreshold(), cv2.Canny(),cv2.kmeans() 函數詳解

  1. cv2.threshold()
    作用:圖像二值化,將灰度圖像轉為黑白圖像或多級閾值圖像。
retval, dst = cv2.threshold(src, thresh, maxval, type)

參數說明:
src: 輸入圖像,必須是灰度圖(單通道,uint8 類型)。
thresh: 閾值,將灰度圖中的像素值與該閾值進行比較。
maxval: 如果滿足閾值規則,輸出像素值將設置為該值。
type: 閾值類型,有以下幾種:
1、cv2.THRESH_BINARY: 大于閾值的像素置為 maxval,否則置為 0。
2、cv2.THRESH_BINARY_INV: 小于閾值的像素置為 maxval,否則置為 0。
3、cv2.THRESH_TRUNC: 大于閾值的像素置為閾值,否則保持原值。
4、cv2.THRESH_TOZERO: 小于閾值的像素置為 0,否則保持原值。
5、cv2.THRESH_TOZERO_INV: 大于閾值的像素置為 0,否則保持原值。

主要用途:
圖像二值化(將物體與背景分離)。
特定場景下的簡單圖像分割。

  1. cv2.adaptiveThreshold()
    作用:圖像局部自適應二值化,根據局部區域內的灰度值確定閾值。這種方法在光照條件不均勻的情況下很有優勢。
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

參數說明:
src: 輸入圖像,必須是灰度圖。
maxValue: 滿足閾值條件的像素的賦值。
adaptiveMethod: 自適應閾值算法,有以下兩種:
cv2.ADAPTIVE_THRESH_MEAN_C: 閾值是局部窗口的平均值減去 C。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 閾值是局部窗口的加權平均值減去 C。
thresholdType: 閾值類型(通常為 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV)。
blockSize: 局部區域的尺寸,必須為奇數(如 3、5、11)。
C: 從局部平均值中減去常數 C。

主要用途:
圖像自適應二值化。
光照不均情況下的前景分離。

  1. cv2.Canny()
    作用:邊緣檢測,采用 Canny 算法從圖像中提取顯著邊緣。
dst = cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])

參數說明:
image: 輸入圖像,需為灰度圖。
threshold1: 較小的閾值,用于邊緣連接。
threshold2: 較大的閾值,用于檢測顯著邊緣。
apertureSize: Sobel 算子的核大小,默認值為 3。通常是 3, 5, 7。
L2gradient: 是否使用更精確的 L2 范數計算梯度,默認為 False

主要用途:
圖像邊緣提取。
準備圖像分割的輪廓信息。

  1. cv2.kmeans()
    作用:基于 K-Means 算法對輸入數據進行聚類,適合圖像顏色分割或亮度分割。
retval, labels, centers = cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)

參數說明:
data: 輸入數據(通常是圖像的像素值矩陣,需轉換為 np.float32)。
K: 聚類數,即分割的類別數量。
bestLabels: 初始標簽(通常為 None)。
criteria: K-Means 的終止條件,例如迭代次數或誤差:
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, max_iter, epsilon)。
max_iter 是最大迭代次數,epsilon 是誤差容忍度。
attempts: 嘗試執行 K-Means 聚類的次數,輸出至少達到局部最優解。
flags: 初始化中心的方法,常用:
cv2.KMEANS_PP_CENTERS: 使用 K-Means++ 初始化中心點。
cv2.KMEANS_RANDOM_CENTERS: 使用隨機選擇初始化中心點。

cv2.dnn.blobFromImage(),transforms.Compose()函數詳解

  1. cv2.dnn.blobFromImage()
    功能:
    cv2.dnn.blobFromImage() 是 OpenCV 的 DNN(深度學習)模塊中的方法,用于將輸入圖像轉換為深度學習模型可以接受的標準化張量(“blob”)。具體包括:
    重新調整圖像大小。
    歸一化圖像像素(例如縮放到 [0,1] 或減去均值)。
    轉換通道順序(例如將圖片從 BGR 轉換為 RGB)。
    轉換維度順序(從 HWC -> CHW,即 [高度, 寬度, 通道] -> [通道, 高度, 寬度])。
cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(width, height),mean=(meanR, meanG, meanB), swapRB=True, crop=False)

參數說明:
image: 輸入圖像,通常是三通道(BGR)圖像或單通道圖像。
scalefactor: 縮放因子,用于將像素值歸一化。例如,設置 scalefactor=1/255 將像素值從 [0,255] 縮放到 [0,1]。
size: 重新調整后的圖像尺寸,通常根據模型的輸入需求設置(如 (224, 224))。
mean: 均值,用于歸一化(針對每個通道減去均值)。例如:(meanR, meanG, meanB)。
swapRB: 是否交換 R 和 B 通道(將 BGR 轉為 RGB),默認為 True。
crop: 是否在調整大小后裁剪圖像,如果為 True,會將圖像裁剪到目標大小。

返回值:
返回一個預處理后的 blob,即一個多維的 numpy 數組,形狀通常為:
[batch_size, channels, height, width]
對單張圖像而言,batch_size = 1。

import cv2
# 讀取圖像(通常是 BGR 格式)
image = cv2.imread('image.jpg')
# 創建 blob
blob = cv2.dnn.blobFromImage(image, scalefactor=1/255.0, size=(224, 224),mean=(0, 0, 0), swapRB=True, crop=False)# 輸出 blob 的形狀:通常為 (1, 3, 224, 224),對應 [batch, channels, height, width]
print("Blob shape:", blob.shape)
# 將 blob 傳入模型
# net.setInput(blob)
# output = net.forward()

常見參數設置:
歸一化:如果模型輸入要求的像素范圍是 [0, 1],可以通過 scalefactor = 1/255 實現歸一化。
均值減法:一些預訓練模型會要求每個通道的均值為特定值,如 (123.68, 116.78, 103.94)(VGG 或 ResNet 等常用)。
圖像尺寸:目標模型的輸入尺寸通常固定,如 (224, 224) 或 (300, 300)。

  1. transforms.Compose()
    功能:
    transforms.Compose() 是 PyTorch 的 torchvision.transforms 模塊中的方法,用來對圖像數據進行多步組合式處理,例如裁剪、縮放、歸一化等。它允許將多個圖像變換操作(transforms)鏈接在一起。
transforms.Compose([transform1, transform2, ..., transformN])

參數說明:
transform1, transform2, …, transformN:每個變換操作都是一個 torchvision.transforms 的實例。 例如:
transforms.Resize(size): 縮放圖像到指定大小。
transforms.CenterCrop(size): 從圖像中央裁剪到指定大小。
transforms.Normalize(mean, std): 標準化張量,減去均值并除以標準差。
transforms.ToTensor(): 將圖像從 PIL 格式轉換為 PyTorch 張量,并歸一化到 [0, 1] 范圍。
transforms.RandomHorizontalFlip§: 隨機水平翻轉,概率為 p。
使用場景:
用于對圖像數據的批量預處理,尤其是在訓練深度學習模型前對數據進行標準化和增強處理。

import torch
from torchvision import transforms
from PIL import Image# 加載圖像
image = Image.open("image.jpg")
# 定義數據變換
data_transforms = transforms.Compose([transforms.Resize((224, 224)),                 # 調整大小到 (224, 224)transforms.ToTensor(),                         # 轉為 PyTorch 張量transforms.Normalize(mean=[0.485, 0.456, 0.406],  # 按通道歸一化 (均值減去)std=[0.229, 0.224, 0.225]) # 按通道歸一化 (標準差除以)
])# 對圖像應用變換
tensor_image = data_transforms(image)
# 檢查結果
print("Tensor shape:", tensor_image.shape)  # 通常為 (3, 224, 224)
print("Tensor values (normalized):", tensor_image)

常用的變換操作:
在這里插入圖片描述
組合數據增強處理示例:

import torchvision.transforms as transforms
from PIL import Image# 加載圖像
image = Image.open("image.jpg")
# 定義數據增強變換
data_transforms = transforms.Compose([transforms.RandomRotation(30),                      # 隨機旋轉 ±30 度transforms.RandomHorizontalFlip(p=0.5),             # 隨機水平翻轉 50% 概率transforms.ColorJitter(brightness=0.2, contrast=0.3),  # 隨機調整亮度和對比度transforms.Resize((224, 224)),                      # 調整大小到 (224, 224)transforms.ToTensor(),                              # 轉為 PyTorch 張量
])
# 應用變換
tensor_image = data_transforms(image)
print("Augmented Tensor Shape:", tensor_image.shape)

cv2.dnn.blobFromImage() vs transforms.Compose()
這兩者主要是針對不同框架的圖像預處理功能:

cv2.dnn.blobFromImage() :主要用于 OpenCV DNN 模型,側重于將輸入格式標準化為深度學習模型的張量。
transforms.Compose() :是 PyTorch 的高級操作,用于批量構造靈活的數據增強和標準化流程。

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

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

相關文章

【Linux】軟件管理機制和軟件安裝

文章目錄 1. 軟件管理器1.1 Linux的軟件管理方式1.2 Linux的常見軟件管理機制RPM和dpkg 2. RPM2.1 rpm安裝2.2 rpm升級與更新2.3 rpm查詢2.4 rpm驗證與數字簽名2.5 rpm反安裝與重建數據庫 3. YUM3.1 yum查詢3.2 yum安裝/升級3.3 yum刪除3.4 yum的配置文件3.5 yum的軟件群組功能…

Android第三次面試總結(網絡篇)

在計算機網絡領域,網絡模型是理解通信原理的基礎框架。本文將詳細解析 OSI 參考模型和 TCP/IP 模型的分層結構、核心功能及實際應用,并通過對比幫助讀者建立完整的知識體系。 一、OSI 參考模型:七層架構的理論基石 OSI(開放系統…

OpenCV day5

函數內容接上文:OpenCV day4-CSDN博客 目錄 9.cv2.adaptiveThreshold(): 10.cv2.split(): 11.cv2.merge(): 12.cv2.add(): 13.cv2.subtract(): 14.cv2.multiply(): 15.cv2.divide(): 1…

智能運維新范式

在制造業、設備制造、工業物聯網等領域,“服務周期長、響應效率低” 始終是產品運維的痛點 —— 設備故障突發時,工程師千里奔赴現場的耗時耗力;非計劃停機帶來的生產損失;客戶對服務體驗的更高期待…… 傳統運維模式早已難以適應…

實現定時發送郵件,以及時間同步

定時發送郵件 部署郵件服務 查看有沒有安裝mailx,安裝了 [root192 ~]# rpm -q mailx mailx-12.5-43.fc38.x86_64去網易拿一下授權碼,寫到配置文件里 vim /etc/mail.rcset fromxxxxxxx163.com set smtpsmtp.163.com set smtp-auth-userxxxxxxx163.com set smtp-auth-passwor…

狀態模式:有限狀態機在電商訂單系統中的設計與實現

狀態模式:有限狀態機在電商訂單系統中的設計與實現 一、模式核心:用狀態切換驅動行為變化 在電商訂單系統中,訂單狀態會隨著用戶操作動態變化:「已創建」的訂單支付后變為「已支付」,發貨后變為「已發貨」&#xff0…

ubuntu 24.02部署java web服務

ubuntu 24.02 版本推薦使用jdk 21版本部署java web服務,開發后先使用sudo java -jar xxx.jar驗證運行結果。 jdk安裝:sudo apt install openjdk-21-jdk-headless 編輯服務文本 [Unit] DescriptionWebMgr Java Application Afternetwork.target mysql.…

深入淺出:LDAP 協議全面解析

在網絡安全和系統管理的世界中,LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)是一個不可忽視的核心技術。它廣泛應用于身份管理、認證授權以及目錄服務,尤其在企業級環境中占據重要地位。本文將從基…

AI書籍大模型微調-基于亮數據獲取垂直數據集

大模型的開源,使得每位小伙伴都能獲得AI的加持,包括你可以通過AIGC完成工作總結,圖片生成等。這種加持是通用性的,并不會對個人的工作帶來定制的影響,因此各個行業都出現了垂直領域大模型。 垂直大模型是如何訓練出來…

【2025軟考高級架構師】——計算機系統基礎(7)

摘要 本文主要介紹了計算機系統的組成,包括硬件和軟件兩大部分。硬件由處理器、存儲器、總線、接口和外部設備等組成,軟件則涵蓋系統軟件和應用軟件。文章還詳細闡述了馮諾依曼計算機的組成結構,包括 CPU、主存儲器、外存等,并解…

AI大模型之模型幻覺

模型幻覺(Model Hallucination)是大模型生成內容時脫離事實、虛構信息的一種現象,尤其在語言模型、圖像生成模型等中較為常見。為了更深入地理解這一現象,我們可以將其分為兩個維度進行分析:內在幻覺(Intrinsic Hallucination) 和 外在幻覺(Extrinsic Hallucination)。…

spring Ai---向量知識庫(一)

在一些垂直領域以及公司內部信息相關或者實時性相關的大模型應用,就無法直接使用chatGPT。 這個時候,向量知識庫就進入了。 通過坐標向量最接近的即為匹配相關答案。 向量模型定義:將文檔向量化,保證內容越相似的文本,…

Viper配置管理筆記

一、什么是 Viper? Viper 是 Go 語言的一個強大工具,就像一個超級管家,專門負責幫你打理程序的各種配置。它能把配置文件(比如 JSON、YAML、TOML 等格式)里的內容讀出來,還能監控配置文件的變化&#xff0…

實現對象之間的序列化和反序列化

1.什么是序列化? 在項目的開發中,為了讓前端更好的分析后端返回的結果,我們一般會將返回的信息進行序列化,序列化就是將返回對象的狀態信息轉換為一種標準化的格式,方便在網絡中傳輸也方便打印日志時號觀察&#xff0…

ThreadLocal - 原理與應用場景詳解

ThreadLocal 的基礎概念 在 Java 的多線程世界里,線程之間的數據共享與隔離一直是一個關鍵話題。如果處理不當,很容易引發線程安全問題,比如數據混亂、臟讀等。而 ThreadLocal 這個工具類,就像是為線程量身定制的 “私人儲物柜”…

iwebsec靶場 文件包含關卡通關筆記11-ssh日志文件包含

目錄 日志包含 1.構造惡意ssh登錄命令 2.配置ssh日志開啟 (1)配置sshd (2)配置rsyslog (3)重啟服務 3.寫入webshell木馬 4.獲取php信息滲透 5.蟻劍連接 日志包含 1.構造惡意ssh登錄命令 ssh服務…

Diamond軟件的使用--(4)搭建Modelsim仿真庫

使用Modelsim仿真的原因 由于diamond自帶的仿真軟件Active-HDL需要另一套Lisence,所以我們使用第三方仿真軟件Modelsim來進行仿真。 Modelsim10.5下載鏈接如下:https://pan.baidu.com/s/1G9699ocWm1UTqK2yS2igyQ 提取碼:lewa 一、Lattice仿…

2025年4月19日,四月第三周,C++,字符串數組答案解析

答案與解析 1. 輸出字符串數組所有元素 cpp 復制 下載 #include <iostream> using namespace std;int main() {string arr[] = {"apple", "banana", "cherry"};int n = sizeof(arr)/sizeof(arr[0]); // 計算數組長度for (int i = 0; …

C語言之高校學生信息快速查詢系統的實現

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 總有人間一兩風&#xff0c;填我十萬八千夢。 &#x1f680; 路漫漫其修遠兮&#xff0c;吾將上下而求索。 C語言之高校學生信息快速查詢系統的實現 目錄 任務陳述與分析 問題陳述問題分析 數據結構設…

【網絡篇】TCP vs UDP底層區別+網絡編程概念

大家好呀 我是浪前 今天講解的是網絡篇的第三章&#xff1a;網絡編程概念和TCP&UDP的區別 網絡編程概念TCP和UDP的區別 跨主機通信:網絡編程插座&#xff1a;網絡編程的本質&#xff1a; 網絡編程的重要概念&#xff1a;客戶端和服務器&#xff1a; 客戶端和服務器的交互模…