中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python圖像掩膜直方圖和HS直方圖怎么實現

發布時間:2022-08-17 10:13:47 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

本篇內容主要講解“Python圖像掩膜直方圖和HS直方圖怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python圖像掩膜直方圖和HS直方圖怎么實現”吧!

一.圖像掩膜直方圖

如果要統計圖像的某一部分直方圖,就需要使用掩碼(蒙板)來進行計算。假設將要統計的部分設置為白色,其余部分設置為黑色,然后使用該掩膜進行直方圖繪制,其完整代碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#讀取圖像
img = cv2.imread('luo.png')

#轉換為RGB圖像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#設置掩膜
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:300] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)

#圖像直方圖計算
hist_full = cv2.calcHist([img], [0], None, [256], [0,256]) #通道[0]-灰度圖

#圖像直方圖計算(含掩膜)
hist_mask = cv2.calcHist([img], [0], mask, [256], [0,256])

plt.figure(figsize=(8, 6))

#設置字體
matplotlib.rcParams['font.sans-serif']=['SimHei']

#原始圖像
plt.subplot(221)
plt.imshow(img_rgb, 'gray')
plt.axis('off')
plt.title("(a)原始圖像")

#繪制掩膜
plt.subplot(222)
plt.imshow(mask, 'gray')
plt.axis('off')
plt.title("(b)掩膜")

#繪制掩膜設置后的圖像
plt.subplot(223)
plt.imshow(masked_img, 'gray')
plt.axis('off')
plt.title("(c)圖像掩膜處理")

#繪制直方圖
plt.subplot(224)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.title("(d)直方圖曲線")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

其運行結果如圖1所示,它使用了一個200×200像素的掩膜進行實驗。其中圖1(a)表示原始圖像,圖1(b)表示200×200像素的掩膜,圖1©表示原始圖像進行掩膜處理,圖1(d)表示直方圖曲線,藍色曲線為原始圖像的灰度值直方圖分布情況,綠色波動更小的曲線為掩膜直方圖曲線。

Python圖像掩膜直方圖和HS直方圖怎么實現

二.圖像HS直方圖

為了刻畫圖像中顏色的直觀特性,常常需要分析圖像的HSV空間下的直方圖特性。HSV空間是由色調(Hue)、飽和度(Saturation)、以及亮度(Value)構成,因此在進行直方圖計算時,需要先將源RGB圖像轉化為HSV顏色空間圖像,然后將對應的H和S通道進行單元劃分,再其二維空間上計算相對應直方圖,再計算直方圖空間上的最大值并歸一化繪制相應的直方圖信息,從而形成色調-飽和度直方圖(或H-S直方圖)。該直方圖通常應用在目標檢測、特征分析以及目標特征跟蹤等場景[1-2]。

由于H和S分量與人感受顏色的方式是緊密相連,V分量與圖像的彩色信息無關,這些特點使得HSV模型非常適合于借助人的視覺系統來感知彩色特性的圖像處理算法。

下面的代碼是具體的實現代碼,使用matplotlib.pyplot庫中的imshow()函數來繪制具有不同顏色映射的2D直方圖。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取圖像
img = cv2.imread('luo.png')

#轉換為RGB圖像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#圖像HSV轉換
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

#計算H-S直方圖
hist = cv2.calcHist(hsv, [0,1], None, [180,256], [0,180,0,256])

#原始圖像
plt.figure(figsize=(8, 6))
plt.subplot(121), plt.imshow(img_rgb, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制H-S直方圖
plt.subplot(122), plt.imshow(hist, interpolation='nearest'), plt.title("(b)")
plt.xlabel("x"), plt.ylabel("y")
plt.show()

圖2(a)表示原始輸入圖像,圖2(b)是原圖像對應的彩色直方圖,其中X軸表示飽和度(S),Y軸表示色調(H)。在直方圖中,可以看到H=140和S=130附近的一些高值,它對應于艷麗的色調。

Python圖像掩膜直方圖和HS直方圖怎么實現

三.直方圖判斷白天黑夜

接著講述一個應用直方圖的案例,通過直方圖來判斷一幅圖像是黑夜或白天。常見的方法是通過計算圖像的灰度平均值、灰度中值或灰度標準差,再與自定義的閾值進行對比,從而判斷是黑夜還是白天[3-4]。

灰度平均值:該值等于圖像中所有像素灰度值之和除以圖像的像素個數。

灰度中值:對圖像中所有像素灰度值進行排序,然后獲取所有像素最中間的值,即為灰度中值。

灰度標準差:又常稱均方差,是離均差平方的算術平均數的平方根。標準差能反映一個數據集的離散程度,是總體各單位標準值與其平均數離差平方的算術平均數的平方根。如果一幅圖看起來灰蒙蒙的, 那灰度標準差就小;如果一幅圖看起來很鮮艷,那對比度就很大,標準差也大。

下面的代碼是計算灰度“Lena”圖的灰度平均值、灰度中值和灰度標準差。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#函數: 獲取圖像的灰度平均值
def fun_mean(img, height, width):
    sum_img = 0
    for i in range(height):
        for j in range(width):
            sum_img = sum_img + int(img[i,j])
    mean = sum_img / (height * width)
    return mean

#函數: 獲取中位數
def fun_median(data):
    length = len(data)
    data.sort()
    if (length % 2)== 1: 
        z = length // 2
        y = data[z]
    else:
        y = (int(data[length//2]) + int(data[length//2-1])) / 2
    return y

#讀取圖像
img = cv2.imread('lena-hd.png')

#圖像灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取圖像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]

#計算圖像的灰度平均值
mean = fun_mean(grayImage, height, width)
print("灰度平均值:", mean)

#計算圖像的灰度中位數
value = grayImage.ravel() #獲取所有像素值
median = fun_median(value)
print("灰度中值:", median)

#計算圖像的灰度標準差
std = np.std(value, ddof = 1)
print("灰度標準差", std)

其運行結果如圖3所示,圖3(a)為原始圖像,圖3(b)為處理結果。其灰度平均值為123,灰度中值為129,灰度標準差為48.39。

Python圖像掩膜直方圖和HS直方圖怎么實現

下面講解另一種用來判斷圖像是白天還是黑夜的方法,其基本步驟如下:

(1)讀取原始圖像,轉換為灰度圖,并獲取圖像的所有像素值;

(2)設置灰度閾值并計算該閾值以下的像素個數。比如像素的閾值設置為50,統計低于50的像素值個數;

(3)設置比例參數,對比該參數與低于該閾值的像素占比,如果低于參數則預測為白天,高于參數則預測為黑夜。比如該參數設置為0.8,像素的灰度值低于閾值50的個數占整幅圖像所有像素個數的90%,則認為該圖像偏暗,故預測為黑夜;否則預測為白天。

具體實現的代碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#函數: 判斷黑夜或白天
def func_judge(img):
    #獲取圖像高度和寬度
    height = grayImage.shape[0]
    width = grayImage.shape[1]
    piexs_sum = height * width
    dark_sum = 0  #偏暗像素個數
    dark_prop = 0 #偏暗像素所占比例
    
    for i in range(height):
        for j in range(width):
            if img[i, j] < 50: #閾值為50
                dark_sum += 1

    #計算比例
    print(dark_sum)
    print(piexs_sum)
    dark_prop = dark_sum * 1.0 / piexs_sum 
    if dark_prop >=0.8:
        print("This picture is dark!", dark_prop)
    else:
        print("This picture is bright!", dark_prop)
               
#讀取圖像
img = cv2.imread('day.png')

#轉換為RGB圖像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#圖像灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#計算256灰度級的圖像直方圖
hist = cv2.calcHist([grayImage], [0], None, [256], [0,255])

#判斷黑夜或白天
func_judge(grayImage)

#顯示原始圖像和繪制的直方圖
plt.subplot(121), plt.imshow(img_rgb, 'gray'), plt.axis('off'), plt.title("(a)")
plt.subplot(122), plt.plot(hist, color='r'), plt.xlabel("x"), plt.ylabel("y"), plt.title("(b)")

plt.show()

第一張測試圖輸出的結果如圖4所示,其中圖4(a)為原始圖像,圖4(b)為對應直方圖曲線。

Python圖像掩膜直方圖和HS直方圖怎么實現

最終輸出結果為“(&lsquo;This picture is bright!&rsquo;, 0.010082704388303882)”,該預測為白天。

Python圖像掩膜直方圖和HS直方圖怎么實現

第二張測試圖輸出的結果如圖6所示,其中圖6(a)為原始圖像,圖6(b)為對應直方圖曲線。

Python圖像掩膜直方圖和HS直方圖怎么實現

最終輸出結果為“(&lsquo;This picture is dark!&rsquo;, 0.8511824175824175)”,該預測為黑夜。

Python圖像掩膜直方圖和HS直方圖怎么實現

到此,相信大家對“Python圖像掩膜直方圖和HS直方圖怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

重庆市| 扶风县| 成安县| 贵港市| 宜城市| 宁都县| 涿鹿县| 礼泉县| 平原县| 南汇区| 蒲城县| 望江县| 大方县| 九台市| 澄迈县| 南和县| 涟源市| 简阳市| 太保市| 呼和浩特市| 炉霍县| 荔波县| 眉山市| 拉孜县| 会理县| 渭源县| 区。| 威信县| 大理市| 灵川县| 陇川县| 巴东县| 石城县| 山西省| 深水埗区| 景宁| 海口市| 宣武区| 赤水市| 唐海县| 石台县|