娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

淺談圖像分割基于閾值處理的基本方法

發(fā)布者:AngelicWhisper最新更新時間:2025-03-18 來源: elecfans關(guān)鍵字:圖像分割  基本方法 手機看文章 掃描二維碼
隨時隨地手機看文章

本文主要介紹圖像分割基于閾值處理的一些基本方法。

一、基于閾值的分割方法

1.1 固定閾值法——直方圖雙峰法

該方法基于圖像直方圖上出現(xiàn)的雙峰現(xiàn)象。當一個圖像有雙峰現(xiàn)象時,其直方圖會出現(xiàn)兩個峰,分別對應(yīng)圖像中兩種不同的顏色或亮度區(qū)域。這時我們可以使用直方圖雙峰法來自動確定合適的閾值。

其基本思路如下:

1. 計算圖像的灰度直方圖。

2. 根據(jù)直方圖的兩個峰的位置,計算出兩個峰之間的閾值,作為圖像的閾值。

3. 根據(jù)計算出的閾值對圖像進行二值化處理,將圖像分成目標和背景兩個部分。

注意:該方法只適用于存在雙峰現(xiàn)象的圖像,對于單峰或峰不明顯的圖像,則需要使用其他的閾值分割方法。

使用cv2.threshold(src, thresh, maxval, type)函數(shù)。

56047284-a05f-11ee-8b88-92fbcf53809c.png

常用的閾值處理方法有:

1.THRESH_BINARY 二值閾值化該方法將像素值與設(shè)定的閾值進行比較,若像素值大于等于閾值,則將該像素值設(shè)為最大值,否則設(shè)為0。可以用于處理灰度圖像與彩色圖像。

2.THRESH_BINARY_INV 反二值閾值化該方法將像素值與設(shè)定的閾值進行比較,若像素值小于閾值,則將該像素值設(shè)為最大值,否則設(shè)為0。可以用于處理灰度圖像與彩色圖像。

3.THRESH_TRUNC 截斷閾值化該方法將像素值與設(shè)定的閾值進行比較,若像素值大于等于閾值,則將該像素值設(shè)為閾值,否則不更改。可以用于處理灰度圖像。

4.THRESH_TOZERO 零閾值化該方法將像素值與設(shè)定的閾值進行比較,若像素值大于等于閾值,則不更改,否則設(shè)為0。可以用于處理灰度圖像。

5.THRESH_TOZERO_INV 反零閾值化該方法將像素值與設(shè)定的閾值進行比較,若像素值小于等于閾值,則不更改,否則設(shè)為0。可以用于處理灰度圖像

代碼:

# 直方圖雙峰法import cv2import numpy as npfrom matplotlib import pyplot as plt

# 讀取圖像(閾值處理方法不同)img = cv2.imread('house.tif',0)x,img1 = cv2.threshold(img,150,255,cv2.THRESH_BINARY)x,img2 = cv2.threshold(img,150,255,cv2.THRESH_TRUNC)x,img3 = cv2.threshold(img,150,255,cv2.THRESH_TOZERO)

# 顯示原始圖像和恢復(fù)后的圖像plt.figure(figsize=(20, 20))plt.subplot(221), plt.imshow(img, cmap='gray')plt.title('Input Image'), plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(img1, cmap='gray')plt.title('seg img THRESH_BINARY'), plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(img2, cmap='gray')plt.title('seg img THRESH_TRUNC'), plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(img3, cmap='gray')plt.title('seg img THRESH_TOZERO'), plt.xticks([]), plt.yticks([])plt.show()

5618e476-a05f-11ee-8b88-92fbcf53809c.png

這種全局閾值處理方法缺點是對噪聲的處理的效果并不好,需要進行平滑處理。

import cv2import randomimport numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('house.tif',0)

# 加上高斯噪聲noise = np.random.normal(0,100,size=img.size).reshape(img.shape[0],img.shape[1])img1 = img + noiseimg1 = np.clip(img1,0,255)

# 平滑處理img2 = cv2.GaussianBlur(img1,(5,5),0)

# 直方圖雙峰法x,img3 = cv2.threshold(img,150,255,cv2.THRESH_BINARY)x,img4 = cv2.threshold(img1,150,255,cv2.THRESH_BINARY)x,img5 = cv2.threshold(img2,150,255,cv2.THRESH_BINARY)

# 顯示原始圖像和恢復(fù)后的圖像plt.figure(figsize=(20, 20))plt.subplot(221), plt.imshow(img, cmap='gray')plt.title('Input Image'), plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(img1, cmap='gray')plt.title('noise img'), plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(img4, cmap='gray')plt.title('seg noise img '), plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(img5, cmap='gray')plt.title('seg blur img '), plt.xticks([]), plt.yticks([])plt.show()

563cd156-a05f-11ee-8b88-92fbcf53809c.png

1.2 迭代閾值圖像分割

這一種自適應(yīng)的圖像分割方法,其主要思想是通過對圖像的灰度值進行迭代,不斷調(diào)整閾值使得分割更加準確。

分割步驟如下:

1. 隨機選取一個初始閾值(可以是圖像的平均灰度值)

2. 根據(jù)該閾值將圖像分割成兩部分:小于等于閾值的部分為前景,大于閾值的部分為背景

3. 計算前景和背景的平均灰度值

4. 將前景和背景的平均灰度值的平均值作為新的閾值

5. 如果新的閾值和原來的閾值相同,則分割結(jié)束。否則,回到第2步,重復(fù)迭代直到收斂

代碼:

#  迭代閾值圖像分割法import numpy as npfrom PIL import Image

# 讀取圖像img = Image.open('house.tif').convert('L')width, height = img.sizepixels = img.load()

# 初始化閾值threshold = 150delta = 1while delta > 0:    # 根據(jù)閾值將圖像分割    foreground = []    background = []    for y in range(height):        for x in range(width):            if pixels[x, y] > threshold:                background.append(pixels[x, y]) #大于閾值的部分為背景            else:                foreground.append(pixels[x, y]) #小于等于閾值的部分為前景    avr_foreground = sum(foreground) // len(foreground)    avr_background = sum(background) // len(background)    # 更新閾值    new_threshold = (avr_foreground + avr_background) // 2    delta = abs(new_threshold - threshold)    threshold = new_threshold

# 重新分割圖像for y in range(height):    for x in range(width):        if pixels[x, y] > threshold:            pixels[x, y] = 255        else:            pixels[x, y] = 0

# 顯示分割后的圖像img.show('result.jpg')

5651895c-a05f-11ee-8b88-92fbcf53809c.png

優(yōu)點:  1.迭代閾值圖像分割相對于靜態(tài)閾值分割而言,具有更高的實用性和魯棒性。  2.該方法能夠有效地應(yīng)對光照變化、背景復(fù)雜多樣等情況下的圖像分割問題。缺點:  對于大尺寸圖像,迭代閾值圖像分割的計算速度可能成為其一個缺點。

1.3 自適應(yīng)閾值圖像分割

1.3.1 常規(guī)方法

分割步驟如下:

1. 針對輸入的灰度圖像,定義一個大小為 N × N N×NN×N 的窗口,在窗口中央選擇一個像素點作為處理的核心像素點。

2. 根據(jù)窗口內(nèi)的像素信息計算局部閾值,作為當前像素的閾值,這個閾值可以是均值、中值、模式等統(tǒng)計量。

3. 將處理完的像素點和當前像素點的局部閾值進行比較,大于等于閾值的像素點設(shè)置為白色,小于閾值的像素點設(shè)置為黑色,分割出新的二值化圖像。

4. 將窗口向圖像的其他區(qū)域移動,繼續(xù)對各個區(qū)域進行高斯自適應(yīng)閾值分割,直到圖像的所有區(qū)域都被分割為二值化圖像。

代碼:

# 自適應(yīng)閾值圖像分割import numpy as npfrom PIL import Image
# 圖像預(yù)處理img = Image.open('house.tif').convert('L')width, height = img.sizepixels = img.load()block_size = 11  # 設(shè)置塊大小

# 分割圖像并計算局部閾值for y in range(0, height, block_size):    for x in range(0, width, block_size):        # 獲取局部區(qū)域        region = []        for j in range(y, y+block_size):            for i in range(x, x+block_size):                if i < width and j < height:                    region.append(pixels[i, j])        # 計算局部區(qū)域平均值作為閾值        threshold = sum(region) // len(region)        # 對區(qū)域進行二值化處理        for j in range(y, y+block_size):            for i in range(x, x+block_size):                if i < width and j < height:                    if pixels[i, j] > threshold:                        pixels[i, j] = 255                    else:                        pixels[i, j] = 0

#顯示分割后的圖像img.show('result.jpg')

566c98c8-a05f-11ee-8b88-92fbcf53809c.png

也可以直接調(diào)用cv2.adaptiveThreshold()函數(shù)實現(xiàn)。

import cv2# 讀取原始圖像img = cv2.imread('house.tif', 0)# 自適應(yīng)閾值分割img_thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 顯示結(jié)果cv2.imshow('Original Image', img)cv2.imshow('Adaptive Thresholding', img_thresh)cv2.waitKey(0)cv2.destroyAllWindows()

568be098-a05f-11ee-8b88-92fbcf53809c.png

1.3.2 大津法(OTSU)

大津法基于以下觀察結(jié)果:當圖像被分為多個區(qū)域時,如果區(qū)域內(nèi)的像素值差異較小,區(qū)域的均值方差就會較小。而當區(qū)域內(nèi)像素值差異較大時,區(qū)域的均值方差就會較大。因此,局部圖像的全局最佳閾值是能使類間方差最大的那個灰度級。

步驟:

56a5d96c-a05f-11ee-8b88-92fbcf53809c.png

代碼:

import cv2
# 讀取圖片img = cv2.imread('house.tif', 0)
# 大津法閾值分割ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 顯示結(jié)果cv2.imshow('Original Image', img)cv2.imshow('OTSU Thresholding', img_thresh)cv2.waitKey(0)cv2.destroyAllWindows()

56c6986e-a05f-11ee-8b88-92fbcf53809c.png

優(yōu)點:  多種檢測任務(wù)效果較好。缺點:  計算量比較大,適用于數(shù)據(jù)量較小的圖像分割場合。

參考文獻:

[1] 阮秋琦,阮宇智譯;(美)拉斐爾·C.岡薩雷斯,理查德·E.伍茲.國外電子書與通信教材系列 數(shù)字圖像處理 第4版[M].北京:電子工業(yè)出版社,2020


關(guān)鍵字:圖像分割  基本方法 引用地址:淺談圖像分割基于閾值處理的基本方法

上一篇:電動機多繞幾圈有影響嗎?
下一篇:編碼器與PLC的接線方法

小廣播
最新嵌入式文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 武夷山市| 瑞昌市| 法库县| 高尔夫| 南平市| 靖西县| 丽水市| 赤水市| 广平县| 静乐县| 满洲里市| 临沂市| 上蔡县| 澄迈县| 甘洛县| 凤庆县| 林芝县| 聂荣县| 六枝特区| 铜川市| 于田县| 古交市| 阜平县| 五家渠市| 游戏| 甘德县| 上思县| 柘城县| 繁昌县| 肃宁县| 吴忠市| 盐边县| 莱州市| 锡林浩特市| 中山市| 高唐县| 佳木斯市| 满城县| 望城县| 五大连池市| 凉山|