主頁 >  其他 > [Python影像處理] 三十七.OpenCV直方圖統計兩萬字詳解(掩膜直方圖、灰度直方圖對比、黑夜白天預測)

[Python影像處理] 三十七.OpenCV直方圖統計兩萬字詳解(掩膜直方圖、灰度直方圖對比、黑夜白天預測)

2021-02-08 12:31:16 其他

該系列文章是講解Python OpenCV影像處理知識,前期主要講解影像入門、OpenCV基礎用法,中期講解影像處理的各種演算法,包括影像銳化算子、影像增強技術、影像分割等,后期結合深度學習研究影像識別、影像分類應用,希望文章對您有所幫助,如果有不足之處,還請海涵~

前面一篇文章介紹了影像幾何變換,包括:影像平移變換、影像縮放變換、影像旋轉變換、影像鏡像變換、影像仿射變換和影像透視變換;這篇文章將詳細介紹直方圖統計,包括Matplotlib和OpenCV繪制直方圖、掩膜直方圖、灰度直方圖對比及通過直方圖預測黑夜白天,萬字長文整理,希望對您有所幫助, 同時,該部分知識均為作者查閱資料撰寫總結,并且開設成了收費專欄,為小寶賺點奶粉錢,感謝您的抬愛,當然如果您是在讀學生或經濟拮據,可以私聊我給你每篇文章開白名單,或者轉發原文給你,更希望您能進步,一起加油喔~

  • https://github.com/eastmountyxz/ImageProcessing-Python

文章目錄

  • 一.影像直方圖概述
  • 二.Matplotlib繪制直方圖
  • 三.OpenCV繪制直方圖
  • 四.掩膜直方圖
  • 五.影像灰度變換直方圖對比
    • 1.灰度上移變換影像直方圖對比
    • 2.灰度減弱影像直方圖對比
    • 3.影像反色變換直方圖對比
    • 4.影像對數變換直方圖對比
    • 5.影像閾值化處理直方圖對比
  • 六.影像H-S直方圖
  • 七.直方圖判斷黑夜白天
  • 八.總結

前文參考:

  • [Python影像處理] 一.影像處理基礎知識及OpenCV入門函式
  • [Python影像處理] 二.OpenCV+Numpy庫讀取與修改像素
  • [Python影像處理] 三.獲取影像屬性、興趣ROI區域及通道處理
  • [Python影像處理] 四.影像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
  • [Python影像處理] 五.影像融合、加法運算及影像型別轉換
  • [Python影像處理] 六.影像縮放、影像旋轉、影像翻轉與影像平移
  • [Python影像處理] 七.影像閾值化處理及演算法對比
  • [Python影像處理] 八.影像腐蝕與影像膨脹
  • [Python影像處理] 九.形態學之影像開運算、閉運算、梯度運算
  • [Python影像處理] 十.形態學之影像頂帽運算和黑帽運算
  • [Python影像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖
  • [Python影像處理] 十二.影像幾何變換之影像仿射變換、影像透視變換和影像校正
  • [Python影像處理] 十三.基于灰度三維圖的影像頂帽運算和黑帽運算
  • [Python影像處理] 十四.基于OpenCV和像素處理的影像灰度化處理
  • [Python影像處理] 十五.影像的灰度線性變換
  • [Python影像處理] 十六.影像的灰度非線性變換之對數變換、伽馬變換
  • [Python影像處理] 十七.影像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
  • [Python影像處理] 十八.影像銳化與邊緣檢測之Scharr算子、Canny算子和LOG算子
  • [Python影像處理] 十九.影像分割之基于K-Means聚類的區域分割
  • [Python影像處理] 二十.影像量化處理和采樣處理及區域馬賽克特效
  • [Python影像處理] 二十一.影像金字塔之影像向下取樣和向上取樣
  • [Python影像處理] 二十二.Python影像傅里葉變換原理及實作
  • [Python影像處理] 二十三.傅里葉變換之高通濾波和低通濾波
  • [Python影像處理] 二十四.影像特效處理之毛玻璃、浮雕和油漆特效
  • [Python影像處理] 二十五.影像特效處理之素描、懷舊、光照、流年以及濾鏡特效
  • [Python影像處理] 二十六.影像分類原理及基于KNN、樸素貝葉斯演算法的影像分類案例
  • [Python影像處理] 二十七.OpenGL入門及繪制基本圖形(一)
  • [Python影像處理] 二十八.OpenCV快速實作人臉檢測及視頻中的人臉
  • [Python影像處理] 二十九.MoviePy視頻編輯庫實作抖音短視頻剪切合并操作
  • [Python影像處理] 三十.影像量化及采樣處理萬字詳細總結(推薦)
  • [Python影像處理] 三十一.影像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)
  • [Python影像處理] 三十二.傅里葉變換(影像去噪)與霍夫變換(特征識別)萬字詳細總結
  • [Python影像處理] 三十三.影像各種特效處理及原理萬字詳解(毛玻璃、浮雕、素描、懷舊、流年、濾鏡等)
  • [Python影像處理] 三十四.數字影像處理基礎與幾何圖形繪制萬字詳解(推薦)
  • [Python影像處理] 三十五.OpenCV影像處理入門、算數邏輯運算與影像融合(推薦)
  • [Python影像處理] 三十六.OpenCV影像幾何變換萬字詳解(平移縮放旋轉、鏡像仿射透視)
  • [Python影像處理] 三十七.OpenCV和Matplotlib繪制直方圖萬字詳解(掩膜直方圖、H-S直方圖、黑夜白天判斷)

影像灰度直方圖(Histogram)是灰度級分布的函式,是對影像中灰度級分布的統計,灰度直方圖是將數字影像中的所有像素,按斬訓度值的大小,統計其出現的頻率并繪制相關圖形,本章主要講解Matplotlib和OpenCV繪制直方圖的兩種方法,對比了灰度處理演算法前后的直方圖,實作掩膜直方圖繪制、影像H-S直方圖、直方圖判斷黑夜白天等內容,

一.影像直方圖概述

灰度直方圖是灰度級的函式,描述的是影像中每種灰度級像素的個數,反映影像中每種灰度出現的頻率,假設存在一幅6×6像素的影像,接著統計其1至6灰度級的出現頻率,并繪制如圖1所示的柱狀圖,其中橫坐標表示灰度級,縱坐標表示灰度級出現的頻率,

在這里插入圖片描述

如果灰度級為0-255(最小值0為黑色,最大值255為白色),同樣可以繪制對應的直方圖,如圖2所示,左邊是一幅灰度影像(Lena灰度圖),右邊是對應各像素點的灰度級頻率,

在這里插入圖片描述

為了讓影像各灰度級的出現頻數形成固定標準的形式,可以通過歸一化方法對影像直方圖進行處理,將待處理的原始影像轉換成相應的標準形式[3],假設變數r表示影像中像素灰度級,歸一化處理后會將r限定在下述范圍:

在這里插入圖片描述

在灰度級中,r為0時表示黑色,r為1時表示白色,對于一幅給定影像,每個像素值位于[0,1]區間之內,接著計算原始影像的灰度分布,用概率密度函式P?實作,為了更好地進行數字影像處理,必須引入離散形式,在離散形式下,用rk表示離散灰度級,P(rk)代替P?,并滿足公式(2),

在這里插入圖片描述

公式中,nk為影像中出現rk這種灰度的像素數,n是影像中像素總數,是概率論中的頻數,l是灰度級總數(通常l為256級灰度),接著在直角坐標系中做出rk和P(rk)的關系圖,則成為灰度級的直方圖,

假設存在一幅3×3像素的影像,其像素值如公式(9-3)所示,則歸一化直方圖的步驟如下:

在這里插入圖片描述

  • 首先統計各灰度級對應的像素個數,用x陣列統計像素點的灰度級,y陣列統計具有該灰度級的像素個數,其中,灰度為1的像素共3個,灰度為2的像素共1個,灰度為3的像素共2個,灰度為4的像素共1個,灰度為5的像素共2個,

在這里插入圖片描述

  • 接著統計總像素個數,如公式(5)所示,

在這里插入圖片描述

  • 最后統計各灰度級的出現概率,通過公式(6)進行計算,其結果如下:

在這里插入圖片描述

繪制的歸一化圖行如圖3所示,橫坐標表示影像中各個像素點的灰度級,縱坐標表示出現這個灰度級的概率,

在這里插入圖片描述

直方圖被廣泛應用于計算機視覺領域,在使用邊緣和顏色確定物體邊界時,通過直方圖能更好地選擇邊界閾值,進行閾值化處理,同時,直方圖對物體與背景有較強對比的景物的分割特別有用,可以應用于檢測視頻中場景的變換及影像中的興趣點,簡單物體的面積和綜合光密度IOD也可以通過影像的直方圖計算而得,


二.Matplotlib繪制直方圖

Matplotlib是Python強大的資料可視化工具,主要用于繪制各種2D圖形,本小節Python繪制直方圖主要呼叫matplotlib.pyplot庫中hist()函式實作,它會根據資料源和像素級繪制直方圖,其函式主要包括五個常用的引數,如下所示:

  • n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor=‘green’, alpha=0.75)
    – arr表示需要計算直方圖的一維陣列
    – bins表示直方圖顯示的柱數,可選項,默認值為10
    – normed表示是否將得到的直方圖進行向量歸一化處理,默認值為0
    – facecolor表示直方圖顏色
    – alpha表示透明度
    – n為回傳值,表示直方圖向量
    – bins為回傳值,表示各個bin的區間范圍
    – patches為回傳值,表示回傳每個bin里面包含的資料,是一個串列

影像直方圖的Python實作代碼如下所示,該示例主要是通過matplotlib.pyplot庫中的hist()函式繪制的,注意,讀取的“picture.bmp”影像的像素為二維陣列,而hist()函式的資料源必須是一維陣列,通常需要通過函式ravel()拉直影像,

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#讀取圖片
img = cv2.imread('lena.bmp')

#灰度轉換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
#直方圖均衡化處理
result = cv2.equalizeHist(gray)

#顯示影像
plt.subplot(221)
plt.imshow(gray, cmap=plt.cm.gray), plt.axis("off"), plt.title('(a)') 
plt.subplot(222)
plt.imshow(result, cmap=plt.cm.gray), plt.axis("off"), plt.title('(b)') 
plt.subplot(223)
plt.hist(img.ravel(), 256), plt.title('(c)') 
plt.subplot(224)
plt.hist(result.ravel(), 256), plt.title('(d)') 
plt.show()

讀取顯示的“lena”灰度影像如圖4所示,

在這里插入圖片描述

最終的灰度直方圖如圖5所示,它將Lena圖256級灰度和各個灰度級的頻數繪制出來,其中x軸表示影像的256級灰度,y軸表示各個灰度級的頻數,

在這里插入圖片描述

如果呼叫下列函式,則繪制的直方圖是經過標準化處理,并且顏色為綠色、透明度為0.75的直方圖,如圖6所示,

  • plt.hist(src.ravel(), bins=256, density=1, facecolor=‘green’, alpha=0.75)

在這里插入圖片描述

彩色直方圖是高維直方圖的特例,它統計彩色圖片RGB各分量出現的頻率,即彩色概率分布資訊,彩色圖片的直方圖和灰度直方圖一樣,只是分別畫出三個通道的直方圖,然后再進行疊加,其代碼如下所示,Lena彩色原始影像如圖7所示,

在這里插入圖片描述

#coding:utf-8
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
src = cv2.imread('Lena.png')

#獲取BGR三個通道的像素值
b, g, r = cv2.split(src)
print(r,g,b)

#繪制直方圖
plt.figure("Lena")
#藍色分量
plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75)
#綠色分量
plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75)
#紅色分量
plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

#顯示原始影像
cv2.imshow("src", src)
cv2.waitKey(0)
cv2.destroyAllWindows()

繪制的彩色直方圖如圖8所示,包括紅色、綠色、藍色三種對比,

在這里插入圖片描述

如果希望將三個顏色分量的柱狀圖分開繪制并進行對比,則使用如下代碼實作,呼叫plt.figure(figsize=(8, 6))函式繪制視窗,以及plt.subplot()函式分別繪制4個子圖,

#coding:utf-8
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#讀取影像
src = cv2.imread('Lena.png')

#轉換為RGB影像
img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

#獲取BGR三個通道的像素值
b, g, r = cv2.split(src)
print(r,g,b)

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

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

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

#繪制藍色分量直方圖
plt.subplot(222)
plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)藍色分量直方圖")

#繪制綠色分量直方圖
plt.subplot(223)
plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(c)綠色分量直方圖")

#繪制紅色分量直方圖
plt.subplot(224)
plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(d)紅色分量直方圖")
plt.show()

最終輸出的圖形如圖9所示,,圖9(a)表示原影像,圖9(b)表示藍色分量直方圖,圖9?表示綠色分量直方圖,圖9(d)表示紅色分類直方圖,

在這里插入圖片描述


三.OpenCV繪制直方圖

前一小節講解了如何呼叫matplotlib庫繪制直方圖,接下來講解使用OpenCV庫繪制直方圖的方法,在OpenCV中可以使用calcHist()函式計算直方圖,計算完成之后采用OpenCV中的繪圖函式,如繪制矩形的rectangle()函式,繪制線段的line()函式來完成,其中,cv2.calcHist()的函式原型及常見六個引數如下:

  • hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
    – hist表示直方圖,回傳一個二維陣列
    – images表示輸入的原始影像
    – channels表示指定通道,通道編號需要使用中括號,輸入影像是灰度影像時,它的值為[0],彩色影像則為[0]、[1]、[2],分別表示藍色(B)、綠色(G)、紅色(R)
    – mask表示可選的操作掩碼,如果要統計整幅影像的直方圖,則該值為None;如果要統計影像的某一部分直方圖時,需要掩碼來計算
    – histSize表示灰度級的個數,需要使用中括號,比如[256]
    – ranges表示像素值范圍,比如[0, 255]
    – accumulate表示累計疊加標識,默認為false,如果被設定為true,則直方圖在開始分配時不會被清零,該引數允許從多個物件中計算單個直方圖,或者用于實時更新直方圖;多個直方圖的累積結果用于對一組影像的直方圖計算

接下來的代碼是計算影像各灰度級的大小、形狀及頻數,接著呼叫plot()函式繪制直方圖曲線,

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#讀取影像
src = cv2.imread('lena.bmp')

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

#輸出直方圖大小、形狀、數量
print(hist.size)
print(hist.shape)
print(hist)

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

#顯示原始影像和繪制的直方圖
plt.subplot(121)
plt.imshow(src, 'gray')
plt.axis('off')
plt.title("(a)Lena灰度影像")

plt.subplot(122)
plt.plot(hist, color='r')
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)直方圖曲線")
plt.show()

上述代碼繪制的“Lena”灰度影像所對應的直方圖曲線如圖10所示,圖10(a)表示原影像,圖10(b)表示對應的灰度直方圖曲線,

在這里插入圖片描述

同時輸出直方圖的大小、形狀及數量,如下所示:

256
(256L, 1L)
[[7.000e+00]
 [1.000e+00]
 [0.000e+00]
 [6.000e+00]
 [2.000e+00]
 ....
 [1.000e+00]
 [3.000e+00]
 [2.000e+00]
 [1.000e+00]
 [0.000e+00]]

彩色影像呼叫OpenCV繪制直方圖的演算法與灰度影像一樣,只是從B、G、R三個放量分別進行計算及繪制,詳見代碼,

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#讀取影像
src = cv2.imread('Lena.png')

#轉換為RGB影像
img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

#計算直方圖
histb = cv2.calcHist([src], [0], None, [256], [0,255])
histg = cv2.calcHist([src], [1], None, [256], [0,255])
histr = cv2.calcHist([src], [2], None, [256], [0,255])

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

#顯示原始影像和繪制的直方圖
plt.subplot(121)
plt.imshow(img_rgb, 'gray')
plt.axis('off')
plt.title("(a)Lena原始影像")

plt.subplot(122)
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)直方圖曲線")
plt.show()

最侄訓制的“Lena”彩色影像及其對應的彩色直方圖曲線如圖11所示,其中圖11(a)表示Lena原始影像,圖11(b)表示對應的彩色直方圖曲線,

在這里插入圖片描述


四.掩膜直方圖

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

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#讀取影像
img = cv2.imread('yxz.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()

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

在這里插入圖片描述


五.影像灰度變換直方圖對比

前面詳細介紹了影像灰度變換和閾值變換,本小節將結合直方圖分別對比影像灰度變換前后的變化,方便讀者更清晰地理解灰度變換和閾值變換,

  • [Python影像處理] 三十一.影像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)

1.灰度上移變換影像直方圖對比

影像灰度上移變換使用的運算式為:

  • DB=DA+50

該演算法將實作影像灰度值的上移,從而提升影像的亮度,結合直方圖對比的實作代碼如下所示,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('lena.bmp')

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

#獲取影像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影像灰度上移變換 DB=DA+50
for i in range(height):
    for j in range(width):
        if (int(grayImage[i,j]+50) > 255):
            gray = 255
        else:
            gray = int(grayImage[i,j]+50)
            
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪制掩膜設定后的影像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪制直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其運行結果如圖13所示,其中(a)表示原始影像,(b)表示對應的灰度直方圖,(c)表示灰度上移后的影像,(d)是對應的直方圖,對比發現,圖13(d)比圖13(b)的灰度級整體高了50,曲線整體向右平移了50個單位,

在這里插入圖片描述


2.灰度減弱影像直方圖對比

該演算法將減弱影像的對比度,使用的運算式為:

  • DB=DA×0.8

Python結合直方圖實作灰度對比度減弱的代碼如下所示,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('lena.bmp')

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

#獲取影像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影像對比度減弱變換 DB=DA×0.8
for i in range(height):
    for j in range(width):
        gray = int(grayImage[i,j]*0.8)
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪制掩膜設定后的影像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪制直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其運行結果如圖14所示,其中(a)和(b)表示原始影像和對應的灰度直方圖,(c)和(d)表示灰度減榷訓對比度縮小的影像及對應的直方圖,圖14(d)比圖14(b)的灰度級整體縮小了0.8倍,繪制的曲線更加密集,

在這里插入圖片描述


3.影像反色變換直方圖對比

該演算法將影像的顏色反色,對原影像的像素值進行反轉,即黑色變為白色,白色變為黑色,使用的運算式為:

  • DB=255-DA

實作代碼如下所示,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('lena.bmp')

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

#獲取影像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影像灰度反色變換 DB=255-DA
for i in range(height):
    for j in range(width):
        gray = 255 - grayImage[i,j]
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪制掩膜設定后的影像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪制直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其運行結果如圖15所示,其中(a)和(b)表示原始影像和對應的灰度直方圖,(c)和(d)表示灰度反色變換影像及對應的直方圖,圖15(d)與圖15(b)是反相對稱的,整個灰度值滿足DB=255-DA運算式,

在這里插入圖片描述


4.影像對數變換直方圖對比

該演算法將增加低灰度區域的對比度,從而增強暗部的細節,使用的運算式為:

在這里插入圖片描述

下面的代碼實作了影像灰度的對數變換及直方圖對比,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('lena.bmp')

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

#獲取影像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影像灰度對數變換
for i in range(height):
    for j in range(width):
        gray = 42 * np.log(1.0 + grayImage[i,j])
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制原始影像直方圖
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#灰度變換后的影像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#灰度變換影像的直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其運行結果如圖16所示,其中(a)和(b)表示原始影像和對應的灰度直方圖,(c)和(d)表示灰度對數變換影像及對應的直方圖,

在這里插入圖片描述


5.影像閾值化處理直方圖對比

該演算法原型為:

  • threshold(Gray,127,255,cv2.THRESH_BINARY)

當前像素點的灰度值大于thresh閾值時(如127),其像素點的灰度值設定為最大值(如9位灰度值最大為255);否則,像素點的灰度值設定為0,二進制閾值化處理及直方圖對比的Python代碼如下所示,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('lena.bmp')

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

#獲取影像高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影像灰度對數變換
for i in range(height):
    for j in range(width):
        gray = 42 * np.log(1.0 + grayImage[i,j])
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪制原始影像直方圖
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#灰度變換后的影像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#灰度變換影像的直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其運行結果如圖17所示,其中(a)和(b)表示原始影像和對應的灰度直方圖,(c)和(d)表示影像閾值化處理及對應的直方圖,圖17(d)中可以看到,灰度值僅僅分布于0(黑色)和255(白色)兩種灰度級,

在這里插入圖片描述


六.影像H-S直方圖

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

由于H和S分量與人感受顏色的方式是緊密相連,V分量與影像的彩色資訊無關,這些特點使得HSV模型非常適合于借助人的視覺系統來感知彩色特性的影像處理演算法,下面代碼是具體的實作代碼,使用matplotlib.pyplot庫中的imshow()函式來繪制具有不同顏色映射的2D直方圖,

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影像
img = cv2.imread('Lena.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()

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

在這里插入圖片描述


七.直方圖判斷黑夜白天

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

  • 灰度平均值:該值等于影像中所有像素灰度值之和除以影像的像素個數,
  • 灰度中值:對影像中所有像素灰度值進行排序,然后獲取所有像素最中間的值,即為灰度中值,
  • 灰度標準差:又常稱均方差,是離均差平方的算術平均數的平方根,標準差能反映一個資料集的離散程度,是總體各單位標準值與其平均數離差平方的算術平均數的平方根,如果一幅圖看起來灰蒙蒙的, 那灰度標準差就小;如果一幅圖看起來很鮮艷,那對比度就很大,標準差也大,

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

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
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.bmp')

#影像灰度轉換
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)

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

在這里插入圖片描述

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

  • 讀取原始影像,轉換為灰度圖,并獲取影像的所有像素值;
  • 設定灰度閾值并計算該閾值以下的像素個數,比如像素的閾值設定為50,統計低于50的像素值個數;
  • 設定比例引數,對比該引數與低于該閾值的像素占比,如果低于引數則預測為白天,高于引數則預測為黑夜,比如該引數設定為0.8,像素的灰度值低于閾值50的個數占整幅影像所有像素個數的90%,則認為該影像偏暗,故預測為黑夜;否則預測為白天,

具體實作的代碼如下所示,

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
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()

第一張測驗圖輸出的結果如圖20所示,其中圖20(a)為原始影像,圖20(b)為對應直方圖曲線,最終輸出結果為“(‘This picture is bright!’, 0.010082704388303882)”,該預測為白天,

在這里插入圖片描述

第二張測驗圖輸出的結果如圖21所示,其中圖21(a)為原始影像,圖21(b)為對應直方圖曲線,最終輸出結果為“(‘This picture is dark!’, 0.8511824175824175)”,該預測為黑夜,

在這里插入圖片描述

最后補充一段3D直方圖代碼,也請同學們下來進行深入的理解及嘗試,

# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

#讀取影像
img = cv.imread("yxz.png")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imgd = np.array(img)      #image類轉numpy

#準備資料
sp = img.shape
h = int(sp[0])        #影像高度(rows)
w = int(sp[1])        #影像寬度(colums) of image

#繪圖初始處理
fig = plt.figure(figsize=(16,12))
ax = fig.gca(projection="3d")

x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)  

#自定義z軸
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10))   #設定z軸網格線的疏密
#將z的value字串轉為float并保留2位小數
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

# 設定坐標軸的label和標題
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)

#添加右側的色卡條
fig.colorbar(surf, shrink=0.6, aspect=8)  
plt.show()

輸出結果如下圖所示:

在這里插入圖片描述


八.總結

寫到這里,本文就介紹完畢,這篇文章主要講解影像直方圖相關知識點,包括Matplotlib和OpenCV兩種統計及繪制直方圖的方法,接著講解了掩膜直方圖和H-S直方圖,并結合灰度變換對比了常見演算法變換前后的直方圖,應用直方圖實作黑夜和白天的判斷,同時,讀者可以嘗試之前的文章和直方圖進行各種繪制,比如均衡化處理、特效處理等等,下圖就是影像均衡化的直方圖,

在這里插入圖片描述

  • 源代碼下載地址,記得幫忙點star和關注喔,
    https://github.com/eastmountyxz/ImageProcessing-Python

時光嘀嗒嘀嗒的流失,這是我在CSDN寫下的第八篇年終總結,比以往時候來的更早一些,《敏而多思,寧靜致遠》,僅以此篇紀念這風雨兼程的一年,這感恩的一年,轉眼小寶白天了,哈哈~提前祝大家新年快樂!

  • 2020年總結:敏而多思,寧靜致遠——紀念這風雨兼程的一年

2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大資料分析、網路空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的演算法實作,娜璋之家會更加系統,并重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝,

在這里插入圖片描述

(By:Eastmount 2021-02-06 晚上12點 http://blog.csdn.net/eastmount/ )


參考文獻,在此感謝這些大佬,共勉!

  • [1] 羅子江, 楊秀璋. Python中的影像處理[M]. 2020.
  • [2]岡薩雷斯. 數字影像處理(第3版)[M]. 北京:電子工業出版社, 2013.
  • [3]張恒博, 歐宗瑛. 一種基于色彩和灰度直方圖的影像檢索方法[J]. 計算機工程, 2004.
  • [4]Eastmount. [數字影像處理] 四.MFC對話框繪制灰度直方圖[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
  • [5]苗錫奎, 孫勁光, 張語涵. 影像歸一化與偽Zernike矩的魯棒水印演算法研究[J]. 計算機應用研究, 2010.
  • [6]阮秋琦. 數字影像處理學(第3版)[M]. 北京:電子工業出版社, 2008.
  • [7]Eastmount. [Python影像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
  • [8]李立源, 龔堅. 基于二維灰度直方圖最佳一維投影的影像分割方法[J]. 自動化學報, 1996.
  • [9]楊秀璋, 顏娜. Python網路資料爬取及分析從入門到精通(分析篇)[M]. 北京:北京航天航空大學出版社, 2018.
  • [10]毛星云, 冷雪飛. OpenCV3編程入門[M]. 北京:電子工業出版社, 2015.
  • [11]深思海數_willschang. Opencv-Python學習筆記七——影像直方圖 calcHist,直方圖均衡化equalizeHist[EB/OL]. (2018-08-26). https://www.jianshu.com/p/bd12c4273d7d.
  • [12]ZJE_ANDY. python3+opencv 利用灰度直方圖來判斷圖片的亮暗情況[EB/OL]. (2018-06-20). https://blog.csdn.net/u014453898/article/details/80745987.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257743.html

標籤:AI

上一篇:2021年美賽C題思路

下一篇:云原生人物志 | Pulsar翟佳:社區的信任最重要

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more