主頁 >  其他 > [Python影像處理] 三十二.傅里葉變換(影像去噪)與霍夫變換(特征識別)萬字詳細總結

[Python影像處理] 三十二.傅里葉變換(影像去噪)與霍夫變換(特征識別)萬字詳細總結

2020-12-03 12:22:19 其他

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

前面一篇文章介紹了民族服飾及文化圖騰識別,詳細講解影像點運算,包括灰度化處理、灰度線性變換、灰度非線性變換、閾值化處理,這篇文章將講解兩個重要的演算法——傅里葉變換和霍夫變換,萬字長文整理,希望對您有所幫助,同時,該部分知識均為作者查閱資料撰寫總結,并且開設成了收費專欄,為小寶賺點奶粉錢,感謝您的抬愛,當然如果您是在讀學生或經濟拮據,可以私聊我給你每篇文章開白名單,或者轉發原文給你,更希望您能進步,一起加油喔~

PS:寫這篇文章另一個重要的原因是Github資源有作者提交了新的貢獻,發現提交的是霍夫變換,因此作者也總結這篇文章,CSDN博客專欄9比1分成,真的挺不錯的,也希望大家能分享更好的文章,

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

在這里插入圖片描述

前文參考:
[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影像處理] 三十一.影像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)

文章目錄

  • 一.影像傅里葉變換概述
  • 二.影像傅里葉變換操作
    • 1.Numpy實作傅里葉變換
    • 2.Numpy實作傅里葉逆變換
    • 3.OpenCV實作傅里葉變換
    • 4.OpenCV實作傅里葉逆變換
  • 三.基于傅里葉變換的高通濾波和低通濾波
    • 1.高通濾波器
    • 2.低通濾波器
  • 四.影像霍夫變換概述
  • 五.影像霍夫線變換操作
  • 六.影像霍夫圓變換操作
  • 七.總結


在數字影像處理中,有兩個經典的變換被廣泛應用——傅里葉變換和霍夫變換,其中,傅里葉變換主要是將時間域上的信號轉變為頻率域上的信號,用來進行影像除噪、影像增強等處理;霍夫變換主要用來辨別找出物件中的特征,用來進行特征檢測、影像分析、數位影像處理等處理,

一.影像傅里葉變換概述

傅里葉變換(Fourier Transform,簡稱FT)常用于數字信號處理,它的目的是將時間域上的信號轉變為頻率域上的信號,隨著域的不同,對同一個事物的了解角度也隨之改變,因此在時域中某些不好處理的地方,在頻域就可以較為簡單的處理,同時,可以從頻域里發現一些原先不易察覺的特征,傅里葉定理指出“任何連續周期信號都可以表示成(或者無限逼近)一系列正弦信號的疊加,”

傅里葉公式(1)如下,其中w表示頻率,t表示時間,為復變函式,它將時間域的函式表示為頻率域的函式f(t)的積分,

在這里插入圖片描述
在這里插入圖片描述

傅里葉變換認為一個周期函式(信號)包含多個頻率分量,任意函式(信號)f(t)可通過多個周期函式(或基函式)相加合成,從物理角度理解,傅里葉變換是以一組特殊的函式(三角函式)為正交基,對原函式進行線性變換,物理意義便是原函式在各組基函式的投影,如上圖所示,它是由三條正弦曲線組合成,其函式為(2)所示,

在這里插入圖片描述

傅里葉變換可以應用于影像處理中,經過對影像進行變換得到其頻譜圖,從譜頻圖里頻率高低來表征影像中灰度變化劇烈程度,影像中的邊緣信號和噪聲信號往往是高頻信號,而影像變化頻繁的影像輪廓及背景等信號往往是低頻信號,這時可以有針對性的對影像進行相關操作,例如影像除噪、影像增強和銳化等,二維影像的傅里葉變換可以用以下數學公式(3)表達,其中f是空間域(Spatial Domain))值,F是頻域(Frequency Domain)值,

在這里插入圖片描述


二.影像傅里葉變換操作

對上面的傅里葉變換有了大致的了解之后,下面通過Numpy和OpenCV分別講解影像傅里葉變換的演算法及操作代碼,

1.Numpy實作傅里葉變換

Numpy中的 FFT包提供了函式 np.fft.fft2()可以對信號進行快速傅里葉變換,其函式原型如下所示,該輸出結果是一個復數陣列(Complex Ndarry),

  • fft2(a, s=None, axes=(-2, -1), norm=None)
    – a表示輸入影像,陣列狀的復雜陣列
    – s表示整數序列,可以決定輸出陣列的大小,輸出可選形狀(每個轉換軸的長度),其中s[0]表示軸0,s[1]表示軸1,對應fit(x,n)函式中的n,沿著每個軸,如果給定的形狀小于輸入形狀,則將剪切輸入,如果大于則輸入將用零填充,如果未給定’s’,則使用沿’axles’指定的軸的輸入形狀
    – axes表示整數序列,用于計算FFT的可選軸,如果未給出,則使用最后兩個軸,“axes”中的重復索引表示對該軸執行多次轉換,一個元素序列意味著執行一維FFT
    – norm包括None和ortho兩個選項,規范化模式(請參見numpy.fft),默認值為無

Numpy中的fft模塊有很多函式,相關函式如下:

  • numpy.fft.fft(a, n=None, axis=-1, norm=None)
    計算一維傅里葉變換
  • numpy.fft.fft2(a, n=None, axis=-1, norm=None)
    計算二維的傅里葉變換
  • numpy.fft.fftn()
    計算n維的傅里葉變換
  • numpy.fft.rfftn()
    計算n維實數的傅里葉變換
  • numpy.fft.fftfreq()
    回傳傅里葉變換的采樣頻率
  • numpy.fft.shift()
    將FFT輸出中的直流分量移動到頻譜中央

下面的代碼是通過Numpy庫實作傅里葉變換,呼叫np.fft.fft2()快速傅里葉變換得到頻率分布,接著呼叫np.fft.fftshift()函式將中心位置轉移至中間,最終通過Matplotlib顯示效果圖,

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv.imread('test.png', 0)

#快速傅里葉變換演算法得到頻率分布
f = np.fft.fft2(img)

#默認結果中心點位置是在左上角,
#呼叫fftshift()函式轉移到中間位置
fshift = np.fft.fftshift(f)       

#fft結果是復數, 其絕對值結果是振幅
fimg = np.log(np.abs(fshift))

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

#展示結果
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('(a)原始影像')
plt.axis('off')
plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('(b)傅里葉變換處理')
plt.axis('off')
plt.show()

輸出結果如圖2所示,圖2(a)為原始影像,圖2(b)為頻率分布圖譜,其中越靠近中心位置頻率越低,越亮(灰度值越高)的位置代表該頻率的信號振幅越大,

在這里插入圖片描述

需要注意,傅里葉變換得到低頻、高頻資訊,針對低頻和高頻處理能夠實作不同的目的,同時,傅里葉程序是可逆的,影像經過傅里葉變換、逆傅里葉變換能夠恢復原始影像,

下列代碼呈現了原始影像在變化方面的一種表示:影像最明亮的像素放到中央,然后逐漸變暗,在邊緣上的像素最暗,這樣可以發現影像中亮、暗像素的百分比,即為頻域中的振幅AA的強度,

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

#讀取影像
img = cv.imread('Na.png', 0)

#傅里葉變換
f = np.fft.fft2(img)

#轉移像素做幅度普
fshift = np.fft.fftshift(f)       

#取絕對值:將復數變化成實數取對數的目的為了將資料變化到0-255
res = np.log(np.abs(fshift))

#展示結果
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Fourier Image')
plt.show()

輸出結果如圖3所示,圖3(a)為原始影像,圖3(b)為頻率分布圖譜,

在這里插入圖片描述


2.Numpy實作傅里葉逆變換

下面介紹Numpy實作傅里葉逆變換,它是傅里葉變換的逆操作,將頻譜影像轉換為原始影像的程序,通過傅里葉變換將轉換為頻譜圖,并對高頻(邊界)和低頻(細節)部分進行處理,接著需要通過傅里葉逆變換恢復為原始效果圖,頻域上對影像的處理會反映在逆變換影像上,從而更好地進行影像處理,

影像傅里葉變化主要使用的函式如下所示:

  • numpy.fft.ifft2(a, n=None, axis=-1, norm=None)
    實作影像逆傅里葉變換,回傳一個復數陣列
  • numpy.fft.fftshift()
    fftshit()函式的逆函式,它將頻譜影像的中心低頻部分移動至左上角
  • iimg = numpy.abs(逆傅里葉變換結果)
    將復數轉換為0至255范圍

下面的代碼分別實作了傅里葉變換和傅里葉逆變換,

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv.imread('Lena.png', 0)

#傅里葉變換
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
res = np.log(np.abs(fshift))

#傅里葉逆變換
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)

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

#展示結果
plt.subplot(131), plt.imshow(img, 'gray'), plt.title(u'(a)原始影像')
plt.axis('off')
plt.subplot(132), plt.imshow(res, 'gray'), plt.title(u'(b)傅里葉變換處理')
plt.axis('off')
plt.subplot(133), plt.imshow(iimg, 'gray'), plt.title(u'(c)傅里葉逆變換處理')
plt.axis('off')
plt.show()

輸出結果如圖4所示,從左至右分別為原始影像、頻譜影像、逆傅里葉變換轉換影像,

在這里插入圖片描述


3.OpenCV實作傅里葉變換

OpenCV 中相應的函式是cv2.dft()和用Numpy輸出的結果一樣,但是是雙通道的,第一個通道是結果的實數部分,第二個通道是結果的虛數部分,并且輸入影像要首先轉換成 np.float32 格式,其函式原型如下所示:

  • dst = cv2.dft(src, dst=None, flags=None, nonzeroRows=None)
    – src表示輸入影像,需要通過np.float32轉換格式
    – dst表示輸出影像,包括輸出大小和尺寸
    – flags表示轉換標記,其中DFT _INVERSE執行反向一維或二維轉換,而不是默認的正向轉換;DFT _SCALE表示縮放結果,由陣列元素的數量除以它;DFT _ROWS執行正向或反向變換輸入矩陣的每個單獨的行,該標志可以同時轉換多個矢量,并可用于減少開銷以執行3D和更高維度的轉換等;DFT _COMPLEX_OUTPUT執行1D或2D實陣列的正向轉換,這是最快的選擇,默認功能;DFT _REAL_OUTPUT執行一維或二維復數陣列的逆變換,結果通常是相同大小的復數陣列,但如果輸入陣列具有共軛復數對稱性,則輸出為真實陣列
    – nonzeroRows表示當引數不為零時,函式假定只有nonzeroRows輸入陣列的第一行(未設定)或者只有輸出陣列的第一個(設定)包含非零,因此函式可以處理其余的行更有效率,并節省一些時間;這種技術對計算陣列互相關或使用DFT卷積非常有用

注意,由于輸出的頻譜結果是一個復數,需要呼叫cv2.magnitude()函式將傅里葉變換的雙通道結果轉換為0到255的范圍,其函式原型如下:

  • cv2.magnitude(x, y)
    – x表示浮點型X坐標值,即實部
    – y表示浮點型Y坐標值,即虛部

該函式最終輸出結果為幅值,即:

在這里插入圖片描述

下面的代碼是呼叫cv2.dft()進行傅里葉變換的一個簡單示例,

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv2.imread('Lena.png', 0)

#傅里葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)

#將頻譜低頻從左上角移動至中心位置
dft_shift = np.fft.fftshift(dft)

#頻譜影像雙通道復數轉換為0-255區間
result = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))

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

#顯示影像
plt.subplot(121), plt.imshow(img, cmap = 'gray')
plt.title(u'(a)原始影像'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(result, cmap = 'gray')
plt.title(u'(b)傅里葉變換處理'), plt.xticks([]), plt.yticks([])
plt.show()

輸出結果如圖5所示,圖5(a)為原始“Lena”圖,圖5(b)為轉換后的頻譜影像,并且保證低頻位于中心位置,

在這里插入圖片描述


4.OpenCV實作傅里葉逆變換

在OpenCV 中,通過函式cv2.idft()實作傅里葉逆變換,其回傳結果取決于原始影像的型別和大小,原始影像可以為實數或復數,其函式原型如下所示:

  • dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])
    – src表示輸入影像,包括實數或復數
    – dst表示輸出影像
    – flags表示轉換標記
    – nonzeroRows表示要處理的dst行數,其余行的內容未定義(請參閱dft描述中的卷積示例)

注意,由于輸出的頻譜結果是一個復數,需要呼叫cv2.magnitude()函式將傅里葉變換的雙通道結果轉換為0到255的范圍,其函式原型如下:

  • cv2.magnitude(x, y)
    – x表示浮點型X坐標值,即實部
    – y表示浮點型Y坐標值,即虛部

該函式最終輸出結果為幅值,即:

在這里插入圖片描述

下面的代碼是呼叫cv2.idft()進行傅里葉逆變換的一個簡單示例,

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv2.imread('Lena.png', 0)

#傅里葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
res1= 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))

#傅里葉逆變換
ishift = np.fft.ifftshift(dftshift)
iimg = cv2.idft(ishift)
res2 = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])

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

#顯示影像
plt.subplot(131), plt.imshow(img, 'gray'), plt.title(u'(a)原始影像')
plt.axis('off')
plt.subplot(132), plt.imshow(res1, 'gray'), plt.title(u'(b)傅里葉變換處理')
plt.axis('off')
plt.subplot(133), plt.imshow(res2, 'gray'), plt.title(u'(b)傅里葉變換逆處理')
plt.axis('off')
plt.show()

輸出結果如圖6所示,圖6(a)為原始“Lena”圖,圖6(b)為傅里葉變換后的頻譜影像,圖6?為傅里葉逆變換,頻譜影像轉換為原始影像的程序,

在這里插入圖片描述


三.基于傅里葉變換的高通濾波和低通濾波

傅里葉變換的目的并不是為了觀察影像的頻率分布(至少不是最終目的),更多情況下是為了對頻率進行過濾,通過修改頻率以達到影像增強、影像去噪、邊緣檢測、特征提取、壓縮加密等目的,

過濾的方法一般有三種:低通(Low-pass)、高通(High-pass)、帶通(Band-pass),所謂低通就是保留影像中的低頻成分,過濾高頻成分,可以把過濾器想象成一張漁網,想要低通過濾器,就是將高頻區域的信號全部拉黑,而低頻區域全部保留,例如,在一幅大草原的影像中,低頻對應著廣袤且顏色趨于一致的草原,表示影像變換緩慢的灰度分量;高頻對應著草原影像中的老虎等邊緣資訊,表示影像變換較快的灰度分量,由于灰度尖銳過度造成,

1.高通濾波器

高通濾波器是指通過高頻的濾波器,衰減低頻而通過高頻,常用于增強尖銳的細節,但會導致影像的對比度會降低,該濾波器將檢測影像的某個區域,根據像素與周圍像素的差值來提升像素的亮度,圖7展示了“Lena”圖對應的頻譜影像,其中心區域為低頻部分,

在這里插入圖片描述

接著通過高通濾波器覆寫掉中心低頻部分,將255兩點變換為0,同時保留高頻部分,高通濾波器處理程序如圖8所示,

在這里插入圖片描述

其中心黑色模板生成的核心代碼如下:

  • rows, cols = img.shape
  • crow,ccol = int(rows/2), int(cols/2)
  • fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

通過高通濾波器將提取影像的邊緣輪廓,生成如圖9所示影像,

在這里插入圖片描述

完整代碼如下所示:

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv.imread('Lena.png', 0)

#傅里葉變換
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)

#設定高通濾波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

#傅里葉逆變換
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)

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

#顯示原始影像和高通濾波處理影像
plt.subplot(121), plt.imshow(img, 'gray'), plt.title(u'(a)原始影像')
plt.axis('off')
plt.subplot(122), plt.imshow(iimg, 'gray'), plt.title(u'(b)結果影像')
plt.axis('off')
plt.show()

輸出結果如圖10所示,圖10(a)為原始“Na”圖,圖10(b)為高通濾波器提取的邊緣輪廓影像,它通過傅里葉變換轉換為頻譜影像,再將中心的低頻部分設定為0,再通過傅里葉逆變換轉換為最終輸出影像,

在這里插入圖片描述


2.低通濾波器

低通濾波器是指通過低頻的濾波器,衰減高頻而通過低頻,常用于模糊影像,低通濾波器與高通濾波器相反,當一個像素與周圍像素的插值小于一個特定值時,平滑該像素的亮度,常用于去燥和模糊化處理,如PS軟體中的高斯模糊,就是常見的模糊濾波器之一,屬于削弱高頻信號的低通濾波器,

下圖展示了“Lena”圖對應的頻譜影像,其中心區域為低頻部分,如果構造低通濾波器,則將頻譜影像中心低頻部分保留,其他部分替換為黑色0,最終得到的效果圖為模糊影像,

在這里插入圖片描述

那么,如何構造該濾波影像呢?如圖12所示,濾波影像是通過低通濾波器和頻譜影像形成,其中低通濾波器中心區域為白色255,其他區域為黑色0,

在這里插入圖片描述

低通濾波器主要通過矩陣設定構造,其核心代碼如下:

  • rows, cols = img.shape
  • crow,ccol = int(rows/2), int(cols/2)
  • mask = np.zeros((rows, cols, 2), np.uint8)
  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1

通過低通濾波器將模糊影像的完整代碼如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#讀取影像
img = cv2.imread('Na.png', 0)

#傅里葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
fshift = np.fft.fftshift(dft)

#設定低通濾波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2) #中心位置
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

#掩膜影像和頻譜影像乘積
f = fshift * mask
print(f.shape, fshift.shape, mask.shape)


#傅里葉逆變換
ishift = np.fft.ifftshift(f)
iimg = cv2.idft(ishift)
res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])

#顯示原始影像和低通濾波處理影像
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()

輸出結果如圖13所示,圖13(a)為原始“Nana”圖,圖13(b)為低通濾波器模糊處理后的影像,

在這里插入圖片描述


四.影像霍夫變換概述

霍夫變換(Hough Transform)是一種特征檢測(Feature Extraction),被廣泛應用在影像分析、計算機視覺以及數位影像處理,霍夫變換是在1959年由氣泡室(Bubble Chamber)照片的機器分析而發明,發明者Paul Hough在1962年獲得美國專利,現在廣泛使用的霍夫變換是由Richard Duda和Peter Hart在1972年發明,并稱之為廣義霍夫變換,經典的霍夫變換是檢測圖片中的直線,之后,霍夫變換不僅能識別直線,也能夠識別任何形狀,常見的有圓形、橢圓形,1981年,因為Dana H.Ballard的一篇期刊論文“Generalizing the Hough transform to detect arbitrary shapes”,讓霍夫變換開始流行于計算機視覺界,

霍夫變換是一種特征提取技術,用來辨別找出物件中的特征,其目的是通過投票程式在特定型別的形狀內找到物件的不完美實體,這個投票程式是在一個引數空間中進行的,在這個引數空間中,候選物件被當作所謂的累加器空間中的區域最大值來獲得,累加器空間是由計算霍夫變換的演算法明確地構建,霍夫變換主要優點是能容忍特征邊界描述中的間隙,并且相對不受影像噪聲的影響,

最基本的霍夫變換是從黑白影像中檢測直線,它的演算法流程大致如下:給定一個物件和要辨別的形狀的種類,演算法會在引數空間中執行投票來決定物體的形狀,而這是由累加空間里的區域最大值來決定,假設存在直線公式如(4)所示,其中m表示斜率,b表示截距,

在這里插入圖片描述

如果用引數空間表示,則直線為(b, m),但它存在一個問題,垂直線的斜率不存在(或無限大),使得斜率引數m值接近于無限,為此,為了更好的計算,Richard O. Duda和Peter E. Hart在1971年4月,提出了Hesse normal form(Hesse法線式),如公式(5)所示,它轉換為直線的離散極坐標公式,

在這里插入圖片描述

其中r是原點到直線上最近點的距離,θ是x軸與連接原點和最近點直線之間的夾角,如圖15-14所示,

在這里插入圖片描述

對于點(x0, y0),可以將通過這個點的一族直線統一定義為公式(6),因此,可以將影像的每一條直線與一對引數(r,θ)相關聯,相當于每一對(r0,θ)代表一條通過點的直線(x0, y0),其中這個引數(r,θ)平面被稱為霍夫空間,

在這里插入圖片描述

然而在實作的影像處理領域,影像的像素坐標P(x, y)是已知的,而(r,θ)是需要尋找的變數,如果能根據像素點坐標P(x, y)值繪制每個(r,θ)值,那么就從影像笛卡爾坐標系統轉換到極坐標霍夫空間系統,這種從點到曲線的變換稱為直線的霍夫變換,變換通過量化霍夫引數空間為有限個值間隔等分或者累加格子,當霍夫變換演算法開始,每個像素坐標點P(x, y)被轉換到(r,θ)的曲線點上面,累加到對應的格子資料點,當一個波峰出現時候,說明有直線存在,

如圖15所示,三條正弦曲線在平面相交于一點,該點坐標(r0,θ)表示三個點組成的平面內的直線,這就是使用霍夫變換檢測直線的程序,它追蹤影像中每個點對應曲線間的交點,如果交于一點的曲線的數量超過了閾值,則認為該交點所代表的引數對(r0,θ)在原影像中為一條直線,

在這里插入圖片描述

同樣的原理,可以用來檢測圓,對于圓的引數方程變為如下等式:

在這里插入圖片描述

其中(a, b)為圓的中心點坐標,r圓的半徑,這樣霍夫引數空間就變成一個三維引數空間,給定圓半徑轉為二維霍夫引數空間,變換相對簡單,也比較常用,


五.影像霍夫線變換操作

在OpenCV中,霍夫變換分為霍夫線變換和霍夫圓變換,其中霍夫線變換支持三種不同方法——標準霍夫變換、多尺度霍夫變換和累計概率霍夫變換,

  • 標準霍夫變換主要有HoughLines()函式實作,
  • 多尺度霍夫變換是標準霍夫變換在多尺度下的變換,可以通過HoughLines()函式實作,
  • 累計概率霍夫變換是標準霍夫變換的改進,它能在一定范圍內進行霍夫變換,計算單獨線段的方向及范圍,從而減少計算量,縮短計算時間,可以通過HoughLinesP()函式實作,

在OpenCV 中,通過函式HoughLines()檢測直線,并且能夠呼叫標準霍夫變換(SHT)和多尺度霍夫變換(MSHT),其函式原型如下所示:

  • lines = HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])
    – image表示輸入的二值影像
    – lines表示經過霍夫變換檢測到直線的輸出矢量,每條直線為(r,θ)
    – rho表示以像素為單位的累加器的距離精度
    – theta表示以弧度為單位的累加器角度精度
    – threshold表示累加平面的閾值引數,識別某部分為圖中的一條直線時它在累加平面中必須達到的值,大于該值線段才能被檢測回傳
    – srn表示多尺度霍夫變換中rho的除數距離,默認值為0,粗略的累加器進步尺寸為rho,而精確的累加器進步尺寸為rho/srn
    – stn表示多尺度霍夫變換中距離精度theta的除數,默認值為0,,如果srn和stn同時為0,使用標準霍夫變換
    – min_theta表示標準和多尺度的霍夫變換中檢查線條的最小角度,必須介于0和max_theta之間
    – max_theta表示標準和多尺度的霍夫變換中要檢查線條的最大角度,必須介于min_theta和π之間

下面的代碼是呼叫HoughLines()函式檢測影像中的直線,并將所有的直線繪制于原影像中,

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#讀取影像
gray = cv2.imread('judge.png', 0)

#灰度變換
#gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#轉換為二值影像
edges = cv2.Canny(gray, 50, 150)

#顯示原始影像
plt.subplot(121), plt.imshow(edges, 'gray'), plt.title('Input Image')
plt.axis('off')

#霍夫變換檢測直線
lines = cv2.HoughLines(edges, 1, np.pi / 180, 160)

#轉換為二維
line = lines[:, 0, :] 

#將檢測的線在極坐標中繪制 
for rho,theta in line[:]: 
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    print x0, y0
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    print x1, y1, x2, y2
    #繪制直線
    cv2.line(gray, (x1, y1), (x2, y2), (255, 0, 0), 2)

#顯示處理影像
plt.subplot(122), plt.imshow(gray, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()

輸出結果如圖16所示,第一幅圖為原始影像,第二幅檢測出的直線,

在這里插入圖片描述

使用該方法檢測大樓影像中的直線如圖17所示,可以發現直線會存在越界的情況,

在這里插入圖片描述

前面的標準霍夫變換會計算影像中的每一個點,計算量比較大,另外它得到的是整條線(r,θ),并不知道原圖中直線的端點,接下來使用累計概率霍夫變換,它是一種改進的霍夫變換,呼叫HoughLinesP()函式實作,

  • lines = HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])
    – image表示輸入的二值影像
    – lines表示經過霍夫變換檢測到直線的輸出矢量,每條直線具有4個元素的矢量,即(x1, y1)和(x2, y2)是每個檢測線段的端點
    – rho表示以像素為單位的累加器的距離精度
    – theta表示以弧度為單位的累加器角度精度
    – threshold表示累加平面的閾值引數,識別某部分為圖中的一條直線時它在累加平面中必須達到的值,大于該值線段才能被檢測回傳
    – minLineLength表示最低線段的長度,比這個設定引數短的線段不能被顯示出來,默認值為0
    – maxLineGap表示允許將同一行點與點之間連接起來的最大距離,默認值0

下面的代碼是呼叫HoughLinesP()函式檢測影像中的直線,并將所有的直線繪制于原影像中,

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
import matplotlib

#讀取影像
img = cv2.imread('judge.png')

#灰度轉換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#轉換為二值影像
edges = cv2.Canny(gray, 50, 200)

#顯示原始影像
plt.subplot(121), plt.imshow(edges, 'gray'), plt.title(u'(a)原始影像')
plt.axis('off')

#霍夫變換檢測直線
minLineLength = 60
maxLineGap = 10
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, minLineLength, maxLineGap)

#繪制直線
lines1 = lines[:, 0, :]
for x1,y1,x2,y2 in lines1[:]:
    cv2.line(img, (x1,y1), (x2,y2), (255,0,0), 2)

res = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

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

#顯示處理影像
plt.subplot(122), plt.imshow(res), plt.title(u'(b)結果影像')
plt.axis('off')
plt.show()

輸出結果如圖18所示,圖18(a)為原始影像,圖18(b)檢測出的直線,它有效地提取了線段的起點和終點,

在這里插入圖片描述


六.影像霍夫圓變換操作

霍夫圓變換的原理與霍夫線變換很類似,只是將線的(r,θ)二維坐標提升為三維坐標,包括圓心點(x_center,y_center,r)和半徑r,其數學形式如公式(7),

在這里插入圖片描述

從而一個圓的確定需要三個引數,通過三層回圈實作,接著尋找引數空間累加器的最大(或者大于某一閾值)的值,隨著資料量的增大,導致圓的檢測將比直線更耗時,所以一般使用霍夫梯度法減少計算量,在OpenCV中,提供了cv2.HoughCircles()函式檢測圓,其原型如下所示:

  • circles = HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
    – image表示輸入影像,8位灰度單通道影像
    – circles表示經過霍夫變換檢測到圓的輸出矢量,每個矢量包括3個元素,即(x, y, radius)
    – method表示檢測方法,包括HOUGH_GRADIENT值
    – dp表示用來檢測圓心的累加器影像的解析度于輸入影像之比的倒數,允許創建一個比輸入影像解析度低的累加器
    – minDist表示霍夫變換檢測到的圓的圓心之間的最小距離
    – param1表示引數method設定檢測方法的對應引數,對當前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示傳遞給Canny邊緣檢測算子的高閾值,而低閾值為高閾值的一半,默認值100
    – param2表示引數method設定檢測方法的對應引數,對當前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在檢測階段圓心的累加器閾值,它越小,將檢測到更多根本不存在的圓;它越大,能通過檢測的圓就更接近完美的圓形
    – minRadius表示圓半徑的最小值,默認值為0
    – maxRadius表示圓半徑的最大值,默認值0

下列代碼是檢測影像中的圓,

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#讀取影像
img = cv2.imread('test01.png')

#灰度轉換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#顯示原始影像
plt.subplot(121), plt.imshow(gray, 'gray'), plt.title('Input Image')
plt.axis('off')

#霍夫變換檢測圓
#circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100,
#                           param1=100, param2=30, minRadius=200, maxRadius=300)

circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param2=30)

print(circles1)

#提取為二維
circles = circles1[0, :, :]

#四舍五入取整
circles = np.uint16(np.around(circles))

#繪制圓
for i in circles[:]: 
    cv2.circle(img, (i[0],i[1]), i[2], (255,0,0), 5) #畫圓
    cv2.circle(img, (i[0],i[1]), 2, (255,0,255), 10) #畫圓心

#顯示處理影像
plt.subplot(122), plt.imshow(img), plt.title('Result Image')
plt.axis('off')
plt.show()

輸出結果如圖19所示,圖19(a)為原始影像,圖圖19(b)檢測出的圓形,它有效地提取了圓形的圓心和輪廓,

在這里插入圖片描述

使用下面的函式能有效提取人類眼睛的輪廓,核心函式如下:

circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
                            param1=100, param2=30,
                            minRadius=160, maxRadius=300)

輸出結果如圖20所示,它提取了三條圓形接近于人體的眼睛,

在這里插入圖片描述

圖20中顯示了三條曲線,通過不斷優化最大半徑和最小半徑,比如將minRadius設定為160,maxRadius設定為200,將提取更為精準的人體眼睛,如圖21所示,

在這里插入圖片描述

最終代碼如下:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#讀取影像
img = cv2.imread('eyes.png')

#灰度轉換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#顯示原始影像
plt.subplot(121), plt.imshow(gray, 'gray'), plt.title('Input Image')
plt.axis('off')

#霍夫變換檢測圓
circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
                            param1=100, param2=30,
                            minRadius=160, maxRadius=200)
print(circles1)

#提取為二維
circles = circles1[0, :, :]

#四舍五入取整
circles = np.uint16(np.around(circles))

#繪制圓
for i in circles[:]: 
    cv2.circle(img, (i[0],i[1]), i[2], (255,0,0), 5) #畫圓
    cv2.circle(img, (i[0],i[1]), 2, (255,0,255), 8) #畫圓心

#顯示處理影像
plt.subplot(122), plt.imshow(img), plt.title('Result Image')
plt.axis('off')
plt.show()

七.總結

本文主要講解傅里葉變換和霍夫變換,傅里葉變換主要用來進行影像除噪、影像增強處理,通過Numpy和OpenCV兩種方法分別進行敘述,并結合代碼加深了讀者的印象;霍夫變換主要用來辨別找出物件中的特征,包括提取影像中的直線和圓,呼叫cv2.HoughLines()、cv2.HoughLinesP()和cv2.HoughCircles()實作,

  • 源代碼下載地址:https://github.com/eastmountyxz/ImageProcessing-Python

時光嘀嗒嘀嗒的流失,這是我在CSDN寫下的第八篇年終總結,比以往時候來的更早一些,《敏而多思,寧靜致遠》,僅以此篇紀念這風雨兼程的一年,這感恩的一年,列車上只寫了一半,這兩天完成,思遠,思君O(∩_∩)O

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

在這里插入圖片描述

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

在這里插入圖片描述

(By:Eastmount 2020-12-02 下午6點寫于武漢 http://blog.csdn.net/eastmount/ )


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

  • [1]岡薩雷斯著. 數字影像處理(第3版)[M]. 北京:電子工業出版社,2013.
  • [2]阮秋琦. 數字影像處理學(第3版)[M]. 北京:電子工業出版社,2008.
  • [3]毛星云,冷雪飛. OpenCV3編程入門[M]. 北京:電子工業出版社,2015.
  • [4]張錚,王艷平,薛桂香等. 數字影像處理與機器視覺——Visual C++與Matlab實作[M]. 北京:人民郵電出版社,2014.
  • [5]百度百科. 傅里葉變換[EB/OL]. (2019.02.05). https://baike.baidu.com/item/傅里葉變換/7119029.
  • [6]網易云課堂_高登教育. Python+OpenCV影像處理[EB/OL]. (2019-01-15). https://study.163.com/course/courseLearn.htm?courseId=1005317018.
  • [7]安安zoe. 影像的傅里葉變換[EB/OL]. (2018-02-01). https://www.jianshu.com/p/89ce7fdb9e12.
  • [8]daduzimama. 影像的傅里葉變換的迷思----頻譜居中[EB/OL]. (2018-06-07). https://blog.csdn.net/daduzimama/article/details/80597454.
  • [9]tenderwx. [數字影像處理] 傅里葉變換在影像處理中的應用[EB/OL]. (2016-03-05). https://www.cnblogs.com/tenderwx/p/5245859.html.
  • [10]小小貓釣小小魚. 深入淺出的講解傅里葉變換(真正的通俗易懂)[EB/OL]. (2018-02-02).
  • [11]https://www.cnblogs.com/h2zZhou/p/8405717.html.
  • [12]百度百科. 霍夫變換[EB/OL]. (2018-11-21). https://baike.baidu.com/item/霍夫變換/4647236.
  • [13]yuyuntan. 經典霍夫變換(Hough Transform)[EB/OL]. (2018-04-29). https://blog.csdn.net/yuyuntan/article/details/80141392.
  • [14]g20040733. 霍夫變換[EB/OL]. (2016-12-07). https://blog.csdn.net/g200407331/article/details/53507784.
  • [15]我i智能. Python下opencv使用筆記(十一)(詳解hough變換檢測直線與圓)[EB/OL]. (2015-07-23). https://blog.csdn.net/on2way/article/details/47028969.
  • [16]ex2tron. Python+OpenCV教程17:霍夫變換[EB/OL]. (2018-01-10). https://www.jianshu.com/p/34d6dc466e81.
  • [17]Daetalus. OpenCV-Python教程(9、使用霍夫變換檢測直線)[EB/OL]. (2013-07-12). https://blog.csdn.net/sunny2038/article/details/9253823.

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

標籤:AI

上一篇:Python自動化測驗從何學起?京東測驗經理規劃的學習路線,你不點進來看看?

下一篇:連續面完阿里巴巴、京東、位元組跳動、螞蟻金服、滴滴、騰訊后,就剩這套面試題了

標籤雲
其他(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