1 概述
?????????Python是一種高級、通用、解釋型的編程語言,由Guido van Rossum于1991年創造。它被設計為易讀易寫的語言,具有簡潔而清晰的語法,使得它成為許多領域的首選語言,如Web開發、科學計算、人工智能、數據分析等。結合本科階段以及研究生階段的進一步使用,預期使用Opencv結合Scikit-imag實現圖像的簡單處理,同時使用PyQt5實現界面的可視化和人機交互。
????????Python在圖像處理領域有著豐富的庫和工具,使得開發人員能夠進行各種圖像處理操作,包括圖像加載、處理、分析和生成等。Python的圖像處理庫能夠加載和保存各種圖像格式,如JPEG、PNG、BMP等,使得開發人員能夠處理不同來源和格式的圖像數據。通過Matplotlib等庫,可以將圖像顯示在屏幕上,進行可視化分析和結果展示。對圖像進行縮放、旋轉、裁剪、平移等變換操作,調整圖像的大小、方向和位置。可以使用各種濾波器對圖像進行模糊、銳化、邊緣增強等處理,改善圖像質量和提取圖像特征。也可以將圖像從一種顏色空間轉換到另一種,如RGB、HSV、LAB等,以便于進行顏色分析和處理。可以對圖像進行分割,將圖像分成多個區域或對象,以及提取圖像中的特征和描述符,用于后續的識別和分析。可以使用機器學習和深度學習技術進行對象檢測和識別,如人臉檢測、物體識別、文字識別等。
????????OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,提供了豐富的圖像處理和計算機視覺算法,涵蓋了從基本的圖像處理操作到高級的計算機視覺任務的各種功能。代碼簡單、應用廣泛、具有很多豐富的功能。Scikit-image是一個基于SciPy的開源Python庫,用于圖像處理。它提供了一系列強大的工具和算法,用于各種圖像處理和分析任務。操作簡單、易于使用,同時兼容numpy。PyQt5是由Riverbank Computing開發的Qt應用程序框架的Python綁定的綜合集合。它使開發人員能夠使用Python創建強大的跨平臺圖形用戶界面(GUI)。PyQt5 是一個強大的框架,用于在 Python 中開發 GUI 應用程序,提供了豐富的功能、優秀的性能和與 Qt 生態系統的無縫集成。無論是構建簡單的實用工具還是復雜的桌面應用程序,PyQt5 都提供了創建精致和功能豐富的用戶界面所需的工具和靈活性。
? ? ? ? 使用Python代碼進行編程實現,并將各個功能集成在一個GUI界面中,建立代碼的可視化界面。具體包括九大板塊:(1)初始化 (2)圖像基本運算(3)圖像幾何變換(4)添加噪聲(5)圖像平滑(6)邊緣檢測(7)形態學處理(8)采樣和量化(9)其他。基本界面如下圖:
2 軟件設計
2.1 初始化
2.1.1 讀取圖片imread
????????cv.imread()?
????????括號里面寫圖片的路徑,同在一個文件夾,可以寫相對路徑也可以絕對路徑;不同文件夾,需要寫絕對路徑。需要注意在Opencv中讀入的圖片顯示格式為BGR。
2.1.2 保存圖片 imwrite
????????cv.imwrite(filename, img, params=None)
????????filename:需要保存圖像的文件名,后綴為格式
????????img:要保存的圖片
????????params:表示為特定格式保存的參數編碼,一般進行操作,使用默認值
2.1.3 重新選擇
????????重新選擇模塊通過啟動一個新的進程來重新啟動 Python 腳本。然而,值得注意的是,這種方法可能不會在所有情況下按預期工作,特別是如果腳本依賴于全局狀態或者在重新啟動之前需要正確關閉一些打開的資源時。此外,在腳本在受限制或沙盒環境中運行的情況下,它可能無法正常工作。
2.1.4 退出系統exit
????????通過定義關閉函數,使用sys模塊中的exit函數,設置點擊按鈕回調關閉函數實現界面的退出。
2.2 圖像基本運算
2.2.1 圖像相加add
????????圖像像素相加時,需要保持圖像的尺寸一致,當像素值相加大于255后會保持255。函數如下:
????????cv.add(src1, src2, dst, mask, dtype)
????????src1:輸入的圖像1
????????src2:輸入的常數矩陣,和圖像1相等大小的,固定常數的矩陣
????????dst:相加后的輸出圖像,一般不對其進行操作
????????mask:8位單通道圖像,用于指定哪些像素需要相加,一般不對其進行操作
????????dtype:輸出圖像的深度(像素值位數),一般不對其進行操作
2.2.2 圖像相減subtract
????????圖像像素相減時,需要保持圖像的尺寸一致。函數如下:
????????cv.subtract(src1, src2, dst, mask, dtype)
????????src1:輸入圖像1
????????src:輸入的常數矩陣,和圖像1相等大小的,固定常數的矩陣
????????dst:相減后的輸出圖像,一般不對其進行操作
????????mask:8位單通道圖像,用于指定哪些像素需要相減,一般不對其進行操作
????????dtype:輸出圖像的深度(像素值位數),一般不對其進行操作
2.2.3 與運算bitwise_and
????????cv.bitwise_and(src1, src2, dst=None, mask=None)
????????src1:輸入圖像1
????????src2:輸入圖像2
????????dst:可選輸出變量,一般不對其進行操作
????????mask:掩膜圖像,可選參數,一般不對其進行操作
2.2.4 或運算bitwise_or
????????cv.bitwise_or(src1, src2, dst, mask)
????????src1:輸入圖像1
????????src2:輸入圖像2
????????dst:可選輸出變量,一般不對其進行操作
????????mask:掩膜圖像,可選參數,一般不對其進行操作
2.2.5 非運算bitwise_not
????????cv.bitwise_not(src, dst, mask)
????????src:輸入圖像
????????dst:可選輸出變量,一般不對其進行操作
????????mask:掩膜圖像,可選參數,一般不對其進行操作
2.2.6 異或運算bitwise_xor
????????cv.bitwise_xor(src1, src2, dst, mask)
????????src1:輸入圖像1
????????src2:輸入圖像2
????????dst:可選輸出變量,一般不對其進行操作
????????mask:掩膜圖像,可選參數,一般不對其進行操作
2.2.7 灰度化
????????圖像的灰度化主要是降低圖像的維度,方便圖像在灰度空間進行處理。
????????cv.cvtColor(src,cv.COLOR_BGR2GRAY)
????????src:輸入的圖片
????????cv.COLOR_BGR2GRAY:這個具體的有很多種,具體格式是cv.COLOR_固定不變,然后是哪個色彩空間到哪個色彩控機,比如BGR到灰度空間,就是BGR2GRAY
2.2.8 二值化
????????cv.threshold(src,thresh,maxval,type,dst)
????????src:輸入圖像
????????thresh:閾值
????????maxval:當type指定為THRESH_BINARY或THRESH_BINARY_INV時,需要設置該值
????????type:指定閾值類型
????????dst:目標圖像
?????????
2.3 圖像幾何變換
2.3.1 平移圖像warpAffine
????????cv.warpAffine(img,mat,size)
????????img:移動的圖像
????????mat:平移矩陣,決定平移的方向和距離 mat = np.float([[1,0,0],[0,1,20]]) 平移矩陣 對y進行平移20個單位
????????size:平移后顯示的圖像大小
2.3.2 旋轉變換getRotationMatrix2D
????????cv.getRotationMatrix2D(center, angle, scale)
????????center:旋轉中心
????????angle:旋轉角度
????????scale:縮放比例
2.3.3 圖片的翻轉flip
????????cv.flip(src,flipCode,dst=None)
????????src:原始圖像
????????dst:代表與原始圖像具有同樣大小,同樣通道數的目標圖像
????????flipCode:旋轉類型具體有三個:
????????0:繞X軸翻轉? ? ? ? ? 正數:繞Y軸翻轉? ? ? ? ? 負數:繞Y軸翻轉
2.3.4 水平鏡像
????????通過for循環對左右像素點進行交換
2.3.5 垂直鏡像
????????通過for循環對上下像素點進行交換
2.3.6 對角鏡像
????????水平鏡像和垂直鏡像同時發生,即對角對稱
2.3.7 仿射變換
????????仿射變換保持了二維圖形的“平直性”(直線經仿射變換后依然為直線)和“平行性”(直線之間的相對位置關系保持不變,平行線經仿射變換后依然為平行線,且直線上點的位置順序不會發生變化)。非共線的三對對應點確定一個唯一的仿射變換。圖像的旋轉加上拉升就是圖像仿射變換,仿射變化也是需要一個M矩陣就可以,但是由于仿射變換比較復雜,一般直接找很難找到這個矩陣,opencv提供了根據變換前后三個點的對應關系來自動求解M。這個函數是M=cv2.getAffineTransform(pos1,pos2),其中兩個位置就是變換前后的對應位置關系。輸出的就是仿射矩陣M。然后在使用函數cv2.warpAffine()
????????M = cv2.getAffineTransform(post1, post2)
????????post1 = 表示變換前的位置
????????post2 = 表示變換后的位置
????????cv2.warpAffine(src, M, (cols, rows))
????????src表示原始圖像
????????M表示仿射變換矩陣
????????(rows, cols)表示變換后的圖像大小,rows表示行數,cols表示列數
2.3.8 透視變換
????????透視變換是把一個圖像投影到一個新的視平面的過程,該過程包括:把一個二維坐標系轉換為三維坐標系,然后把三維坐標系投影到新的二維坐標系。該過程是一個非線性變換過程,因此,一個平行四邊形經過透視變換后只得到四邊形,但不平行。主要使用cv.getPerspectiveTransform()構建透視矩陣,然后用cv.warpPerspective()進行透視位置的變換。
2.4 添加噪聲
????????主要添加四種噪聲:
????????(1)高斯噪聲:高斯噪聲是一種常見的隨機噪聲形式,它在許多自然和工程系統中都會出現。這種噪聲的產生源于各種隨機過程,例如電子器件的熱運動、傳感器的不確定性、光的散射等。高斯噪聲的特點是其在時間或空間域內的數值服從高斯分布(也稱為正態分布)。這意味著大多數樣本都集中在均值附近,而較少的樣本分布在離均值較遠的位置。處理高斯噪聲的一個常見方法是使用濾波器,如高斯濾波器或均值濾波器,來嘗試減少噪聲的影響。
????????(2)泊松噪聲:泊松噪聲是一種常見的隨機噪聲形式,通常出現在計數型數據中,例如圖像中的像素值、聲音中的聲波振幅等。泊松噪聲的產生源于隨機事件的統計性質,例如光子在圖像傳感器上的隨機分布、聲音波在傳感器上的隨機到達等。泊松分布是描述獨立隨機事件發生次數的概率分布,它是二項分布的一種極限情況。處理泊松噪聲的一個常見方法是使用濾波器進行平滑處理,例如中值濾波器或高斯濾波器。此外,可以利用泊松噪聲的統計特性進行后處理,例如使用泊松分布的最大似然估計來恢復原始信號。
????????(3)椒鹽噪聲:椒鹽噪聲是一種常見的圖像噪聲,通常在圖像采集、傳輸或存儲過程中產生。這種噪聲的特點是圖像中隨機出現的黑白像素點,看起來就像是圖像中撒了椒和鹽一樣,因此得名椒鹽噪聲。椒鹽噪聲通常由于傳感器故障、信號傳輸中的干擾、存儲介質損壞等因素引入。它可以出現在任何類型的圖像中,但在低質量或老化的圖像采集設備中更為常見。椒鹽噪聲的影響通常是使圖像中的細節變得模糊或混淆,降低圖像質量。處理椒鹽噪聲的一個常見方法是使用濾波器進行去噪。中值濾波器是處理椒鹽噪聲的一種有效方法,它將每個像素的值替換為它周圍像素的中值,從而消除異常值的影響,但保留了圖像的邊緣特征。除了中值濾波器外,還有其他去噪方法,如均值濾波器、高斯濾波器等。選擇哪種方法取決于圖像的特點以及對圖像細節的要求。
????????(4)乘性噪聲:乘性噪聲是一種在信號處理領域中常見的噪聲類型,它與原始信號的幅度成比例地影響信號的每個樣本。乘性噪聲通常是由于信號采集或傳輸過程中的不確定性、噪聲源的非線性特性等因素引入的。與加性噪聲不同,乘性噪聲不是簡單地加在原始信號上,而是通過將原始信號的每個樣本乘以一個隨機變量來引入噪聲。這意味著乘性噪聲的影響與信號的強度有關,因此在信號的低幅度部分,噪聲的影響可能會更為顯著。乘性噪聲在圖像處理領域中也很常見。例如,在數字攝影中,光照不均勻或傳感器特性可能會引入乘性噪聲,導致圖像的局部對比度降低。在圖像傳輸中,乘性噪聲可以由于信號傳輸的非線性特性、傳輸介質的失真等因素引入。處理乘性噪聲的方法通常需要考慮信號的幅度特性。一種常見的方法是使用局部對比度增強技術,例如直方圖均衡化或自適應對比度增強,以提高圖像的可視化質量。另一種方法是使用適應性濾波器,這些濾波器可以根據信號的局部特性來調整濾波參數,以有效地減少乘性噪聲的影響。
????????具體函數如下:
????????使用Scikit-image中的函數添加噪聲,設置參數改變噪聲模型
????????skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)
????????image: 添加噪聲的圖像
????????mode: 添加的噪聲類型:
????????‘gaussian’ 高斯加性噪聲? ? ? ? ? ? ? ?
????????‘localvar’ 高斯加性噪聲,每點具有特定的局部方差
?????????‘poisson’ 泊松分布的噪聲
?????????'salt’鹽噪聲,隨機用1替換像素。屬于高灰度噪聲
?????????‘pepper’ 胡椒噪聲,隨機用0或-1替換像素,屬于低灰度噪聲
????????‘s&p’椒鹽噪聲,兩種噪聲同時出現,呈現出黑白雜點)?
????????后面的參數在運用時一般不對其操作,直接使用默認值
2.5 圖像平滑
2.5.1 均值濾波blur
????????cv.blur(src,ksize)
????????src:需要處理的圖像
????????ksize:選取的核大小
????????example? ?cv.blur(img,(6,5))
2.5.2 方框濾波boxFilter
????????cv.boxFilter(src,ddepth,ksize,normalize)
????????src:輸入圖片
????????ddepth:目標圖像的深度
????????ksize:核大小
????????normalize:是否歸一化,使用布爾值進行選擇
????????example? cv.boxFilter(img, ddepth = -1, ksize(2,2),normalize = False)
2.5.3 高斯濾波GaussianBlur
????????cv.GaussianBlur(src,kszie,sigmax)
????????src:輸入圖片
????????ksize:濾波器大小
????????sigmax:標準差,一般設置為0
????????example? cv.GaussianBlur(img,(5,5),0)
2.5.4 中值濾波 medianBlur
????????cv.medianBlur(src,ksize)
????????src:輸入圖片
????????ksize:濾波器尺寸大小,必須為奇數
????????example? cv.medianBlur(img,9)
2.6 邊緣檢測
2.6.1 Sobel算子Sobel
????????Sobel算子是一種經典的圖像邊緣檢測算子,常用于計算圖像中的梯度。它能夠識別圖像中的邊緣(即圖像中像素值變化劇烈的地方),從而對圖像進行邊緣檢測和特征提取。Sobel算子是基于離散卷積運算的一種算子,它通過在圖像上應用卷積核來計算圖像中每個像素的梯度值。
????????函數如下:
????????cv.Sobel(src,ddepth,dx,dy,ksize)
????????src :輸入圖像
????????ddepth:輸出圖像深度,輸入8U有正負一起可能值很大,最好是CV_16S/CV_32F
????????dx:X方向,幾階導數
????????dy:?Y方向,幾階導數.
????????ksize:Sobel算子ksize大小,必須是1、3、5、7
????????example:? cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
2.6.2 Laplacian算子Laplacian
????????Laplacian算子是一種用于圖像處理和計算機視覺中的邊緣檢測算子,它能夠識別圖像中的二階邊緣(即圖像中的像素值變化的二階導數)。與Sobel算子等一階邊緣檢測算子不同,Laplacian算子能夠更好地突出圖像中的邊緣特征,因為它考慮了像素值的變化率和變化方向。
????????函數如下:
????????cv.Laplacian(src,ddepth,ksize)
????????src:輸入圖像
????????ddepth:輸出圖像深度
????????ksize:核大小
????????example:? cv.Laplacian(img,cv.CV_64F)
2.6.3 Scharr算子Scharr
????????Scharr算子是一種用于圖像處理和邊緣檢測的算子,類似于Sobel算子。它是一種對Sobel算子的改進,能夠更加靈敏地檢測圖像中的邊緣。Scharr算子在計算圖像的梯度時,與Sobel算子相比,采用了更精確的卷積核。Scharr算子具有兩個3x3的卷積核,分別用于水平方向(Gx)和垂直方向(Gy)的梯度計算。
????????函數如下:
????????cv.Scharr(src,ddepth,dx,dy,ksize)
????????src :輸入圖像
????????ddepth:輸出圖像深度,輸入8U有正負一起可能值很大,最好是CV_16S/CV_32F
????????dx:X方向,幾階導數
????????dy:?Y方向,幾階導數.
????????ksize:核大小
????????example:? cv.Scharr(img,cv.CV_64F,0,1)
2.6.4 Canny算子Canny
????????Canny算法的輸出是一個二值圖像,其中邊緣被表示為白色像素,而其他區域為黑色像素。由于Canny算法能夠準確地識別圖像中的邊緣,并且對于噪聲具有較強的抵抗能力,因此它被廣泛應用于許多圖像處理任務,例如目標檢測、圖像分割、物體識別等。
????????函數如下:
????????cv.Canny(src,threshold1,threshold2)
????????src:輸入圖片
????????threshold1:閾值1
????????threshold2:閾值2
????????example cv.Canny(img,100,200)
2.7 形態學處理
2.7.1 圖像腐蝕erode
????????圖像腐蝕是圖像處理中的一種基本操作,通常用于去除圖像中的小區域或細節,或者縮小圖像中的物體。腐蝕操作通過滑動一個結構元素(也稱為核)在圖像上,將核與圖像重疊的區域內的像素值取最小值,從而使圖像中的邊緣變細或消失。
????????函數如下:
????????cv.erode(src,kernel,iterations)?
????????src:輸入圖像
????????kernel:核的大小
????????iterations:迭代次數,默認為1
????????example? cv.erode(img,kernel=(3,3),iterations=1)
2.7.2 圖像膨脹dilate
????????圖像膨脹是圖像處理中的一種基本操作,通常用于增強圖像中的物體或區域,或者連接圖像中的物體。膨脹操作通過滑動一個結構元素(也稱為核)在圖像上,將核與圖像重疊的區域內的像素值取最大值,從而擴展或增強圖像中的物體。
????????函數如下:
????????cv.dilate(src,kernel,iterations)
????????src:輸入圖像
????????kernel:核的大小
????????iterations:迭代次數,默認為1
????????example? cv.dilate(img,kernel=(3,3),iterations=1)
2.7.3 圖像開、閉、梯度、頂帽、底帽運算morphologyEx
????????圖像開、閉、梯度、頂帽、底帽是圖像處理中常用的形態學運算,它們基于圖像的形態學特征進行操作,通常用于圖像的增強、分割、去噪等應用。
????????(1)開運算(Opening): 開運算是先進行腐蝕操作,再進行膨脹操作。它的作用是去除圖像中的小物體或者細小的結構,以及消除圖像中的小孔洞。
????????(2)閉運算(Closing): 閉運算是先進行膨脹操作,再進行腐蝕操作。它的作用是填充圖像中的小孔洞,平滑物體的邊界,并連接相鄰的物體。
????????(3)梯度運算(Gradient): 梯度運算是用膨脹操作的結果減去腐蝕操作的結果。它的作用是突出圖像中的邊緣或物體輪廓。
????????(4)頂帽運算(Top Hat): 頂帽運算是原始圖像減去開運算的結果。它的作用是突出圖像中的明亮區域,并且可以檢測到圖像中的小亮點或小區域。
????????(5)底帽運算(Black Hat): 底帽運算是閉運算的結果減去原始圖像。它的作用是突出圖像中的暗區域,并且可以檢測到圖像中的小暗點或小區域。
????????函數如下:
????????cv.morphologyEx(src,op,kernel)
????????src:輸入圖像
????????op:操作的類型
????????kernel:核的大小
????????開運算把類型設為cv.MORPH_OPEN
????????閉運算把類型設為cv.MORPH_CLOSE
????????梯度運算把類型設為cv.MORPH_GRADIENT
????????頂帽運算把類型設為cv.MORPH_TOPHAT
????????底帽運算把類型設為cv.MORPH_BLACKHAT
2.7.4 自適應閾值adaptiveThreshold
????????cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C,dst=None)
????????src:輸入的圖像
????????maxValue:最大值
????????adaptiveMethod:自適應的方法有兩種,一種是cv.ADAPTIVE_THRESH_MEAN_C,領域內的像素值的權值一樣;另一種是cv.ADAPTIVE_THRESH_GAUSSIAN_C,領域內的像素值的權值不同,與到中心的距離有關系,呈現高斯分布,通過高斯方程得到各個點的權重。
????????thresholdType:代表閾值處理的方法,該值必須是cv.THRESH_BINARY或者cv.THRESH_BINARY_INV中的一個
????????blockSize:塊的大小,計算閾值使用的尺寸,3,5,7等
????????C:常量對每個blockSize所指定的領域的加權平均值減去常量C
2.8 采樣和量化
2.8.1 圖像采樣
????????圖片采樣是把圖片以一定的間隔進行像素采樣,采樣就是對圖像的像素值等間隔取值,代碼段如下:
????????img8 = img1[0:-1:2, 0:-1:2]? # 間隔為2采樣
????????img9 = img1[0:-1:4, 0:-1:4]
????????img10 = img1[0:-1:8, 0:-1:8]
????????img11 = img1[0:-1:16, 0:-1:16]
2.8.2 圖像量化
????????量化即對圖像進去取模,然后以一些像素值代替所有像素值,其原理與二值法相似,沒有具體的函數,參考代碼段如下:
????????img3 = np.uint8(img1/16)*16
????????img4 = np.uint8(img/32)*32
????????img5 = np.uint8(img/64)*64
????????img6 = np.uint8(img >= 128)*128
2.8.3 高斯金字塔上下采樣pyrDown pyrUp
????????高斯金字塔是一種用于圖像分析和處理的多尺度表示方法,它能夠在不同尺度下提取圖像的特征信息。在高斯金字塔中,每一層圖像都是通過對上一層圖像進行高斯模糊(低通濾波)和下采樣(降低分辨率)得到的。在高斯金字塔中,向下采樣(下采樣)是指將原始圖像縮小到更小的尺寸。這通常通過對原始圖像進行濾波然后進行取樣來實現。
????????函數如下:
????????cv.pyrDown(src)
????????src:輸入要下采樣的圖片
????????cv.pyrUp(src)
????????src:輸入要上采樣的圖片
????????上采樣下采樣不可逆,因為丟失的圖像序列信息是未知的,需要通過拉普拉斯金字塔來還原原圖
2.8.4 局部馬賽克
?????? 馬賽克的原理就是一片區域的像素點以區域里的一個點代替,產生相同像素點,在人眼形成“馬賽克視覺”
2.8.5 圖像油畫
????????圖像油畫是通過量化和濾波實現的一種視覺上的效果,具體步驟如下:
????????(1)將圖像轉化為灰度圖像
????????(2)將圖像劃分為一個個小方框(4*4,6*6...),并統計其中的每一個像素點像素值
????????(3)對方框中的像素點的的灰度值進行量化(可以參考我之前的關于量化的文章),并對不同的等級的像素點數目進行計數
????????(4)找到方框中灰度等級最多的像素點,并對這些像素點的灰度值求平均
????????(5)用平均值代替原像素像素值
2.9 其他
2.9.1 直方圖均衡化
????????直方圖均衡化是一種用于增強圖像對比度的常用技術,它能夠使圖像中的像素分布更加均勻,從而提高圖像的視覺效果和細節可見性。直方圖均衡化的基本思想是通過調整圖像的像素值分布,使其在整個灰度范圍內更加均勻分布,從而增強圖像的對比度。
????????函數如下:
????????全局直方圖均衡化 equalizeHist
????????cv.equalizeHist(src)
????????src:需要直方圖均衡化的圖片
????????局部直方圖均衡化 createCLAHE
????????cv.createCLAHE(clipLimit, tileGridSize)
????????clipLimit:一般設置為2.0
????????tileGridSize:對圖像進行小區域分割
????????example??cv.createCLAHE(clipLimit=2.0, tileGridSize=(10, 10))
2.9.2 SLIC算法
????????超像素由一系列位置相鄰且顏色、亮度、紋理等特征相似的像素點組成的小區域。這些小區域大多保留了進一步進行圖像分割的有效信息,且一般不會破壞圖像中物體的邊界信息,用少量的超像素代替大量像素表達圖像特征,降低了圖像處理的復雜度,一般作為分割算法的預處理步驟。SLIC算法生成的像素塊相對緊湊,領域特征容易表達;同時需要設置調整的參數少,操作簡單,速度快,對于圖像的緊湊度、輪廓保持擁有很好的效果;兼容灰度圖和彩色圖的分割。
2.9.3 OTSU算法
????????Otsu算法是一種用于圖像分割的經典方法,通常用于將圖像分成兩個部分:背景和前景。該算法由日本學者大津展之于1979年提出,它利用圖像的灰度直方圖來自動確定一個閾值,將圖像分成兩個類別。
????????算法步驟:
- 計算圖像的灰度直方圖。
- 根據直方圖,計算圖像的總體平均灰度。
- 遍歷所有可能的閾值(從最小灰度值到最大灰度值),針對每個閾值,計算兩個類別的權重、平均灰度和類間方差。
- 根據類間方差的最大值所對應的閾值,進行圖像分割。
3 結果展示(部分)
3.1 圖像相加
3.2 與運算
3.3 或運算
3.4 非運算
3.5 灰度化
3.6 二值化
3.7 平移變換
3.8 旋轉變換
3.9 上下翻轉
3.10 對角鏡像
3.11 仿射變換
3.12 透視變換
3.13 高斯噪聲
3.14 椒鹽噪聲
3.15 均值濾波
3.16 高斯濾波
3.17 Sobel算子
3.18 Canny算子
3.19 圖像腐蝕
3.20 梯度運算
3.21 自適應閾值
3.22 圖像采樣
3.23 圖像量化
3.24 局部馬賽克
3.25 SLIC算法
3.26 OTSU算法
4 關鍵問題
????????問題一:PyQt5的版本適配問題
????????PyQt5的版本與qt5-tools版本不適配,導致GUI界面運行不出來。
????????問題二:PyUIC和PyRCC的配置
????????使用Qt.Designer設計GUI界面的布局時,需要使用PyUIC將ui文件轉換成 python代碼 ,然而在配置PyUIC時候找不到pyuic.exe文件的路徑,最后發現是qt5和qt5-tools版本不適配,版本過低,沒有pyuic.exe和pyrcc.exe,將qt5庫卸載后安裝高級版本解決。
????????問題三:Opencv讀取圖片格式問題
????????Opencv讀取圖片的格式為BGR格式,直接使用pyqt5顯示的圖片格式為RGB與預期的圖片處理結果不符合。最后查閱大量的資料,使用rgbSwapped函數將圖片RGB轉回到BGR格式問題解決。
????????問題四:采樣后輸出的圖片尺寸問題
????????圖片在采樣后,圖片的尺寸發生變化,導致在窗口顯示異常。使用resize函數,在圖像每次進行采樣后,對圖像的尺寸進行改變顯示正常。
????????問題五:文本框輸入內容通過超參數傳遞時類型不匹配
????????在LineEdit控件中輸入旋轉角度的時候,LineEdit返回的輸入內容為字符串形式,不能直接填入getRotationMatrix2D函數當作參數使用。首先將字符串進行分割,形成一個列表,采用索引的方式充當函數的參數,實現圖像的正常旋轉。
5 改進方法
????????此次設計的大多使用按鍵控制,下一步的改進希望使用TreeWidget實現折疊側邊欄來解放界面,消除界面設計的冗余。同時對界面進行色彩上的美化,設計多窗口折疊顯示。