圖像濾波和圖像混合 Image Filtering and Hybrid Images
項目要求
- 通過濾波分離圖像的高頻和低頻。
- 將不同圖像的高頻和低頻合併以創建相關尺度的圖像。
項目原理
-
圖像的頻率:
頻率是灰度值變化劇烈程度的指標,是灰度在平面空間上的梯度。圖像中的低頻信號和高頻信號也叫做低頻分量和高頻分量。
-
低頻:
低頻就是顏色緩慢地變化,也就是灰度緩慢地變化,就代表着那是連續漸變的一塊區域,這部分就是低頻。 對於一幅圖像來說,除去高頻的就是低頻了,也就是邊緣以內的內容爲低頻,而邊緣內的內容就是圖像的大部分信息,即圖像的大致概貌和輪廓,是圖像的近似信息。所以說低頻分量主要對整幅圖像的強度的綜合度量。
-
高頻:
反過來,高頻就是頻率變化快。當相鄰區域之間灰度相差很大,這就是變化得快。圖像中,一個影像與背景的邊緣部位,通常會有明顯的差別,也就是說變化那條邊線那裏,灰度變化很快,也即是變化頻率高的部位。因此,圖像邊緣的灰度值變化快,就對應着頻率高,即高頻顯示圖像邊緣。圖像的細節處也是屬於灰度值急劇變化的區域,正是因爲灰度值的急劇變化,纔會出現細節。所以說高頻分量主要是對圖像邊緣和輪廓的度量。
另外噪聲(即噪點)也是這樣,當一個像素所在的位置與正常的點顏色不一樣(該像素點灰度值明顯不一樣,也就是灰度有快速地變化)時可視爲噪聲。
主要函數
my_imfilter()
函數解釋
my_imfilter函數目的是實現類似於scipy.ndimage.filters.correlate函數的功能。在對於彩色圖像(即三通道RGB圖像)進行處理時,應該分別對每一個通道分別進行濾波處理。
輸入參數
- 待處理圖像(255 * 255 * 3)
- 濾波器(3 * 3)
輸出參數
濾波處理後的圖像(255 * 255 * 3)
主要實現步驟
-
通過numpy的shape函數得圖像和濾波器的尺寸(長和寬)
im_dim=image.shape flt_dim=imfilter.shape img_dim1=im_dim[0] img_dim2=im_dim[1] flt_dim1=flt_dim[0] flt_dim2=flt_dim[1]
- 爲了避免因爲卷積運算導致輸出圖像縮小和圖像邊緣信息丟失,常常採用圖像邊緣填充技術,即在圖像四周邊緣填充0,使得卷積運算後圖像大小不會縮小,同時也不會丟失邊緣和角落的信息。其中,長度和寬度的增加量取決於過濾器的大小
pad_dim1=int((flt_dim1-1)/2) pad_dim2=int((flt_dim2-1)/2)
- 使用numpy的zero函數初始化填充數組爲0
pad_mat=np.zeros((img_dim1+2*pad_dim1,img_dim2+2*pad_dim2,3))
- 把填充數組和原始圖像相整合
pad_mat[pad_dim1: img_dim1 + pad_dim1, pad_dim2: img_dim2 + pad_dim2] = image
- 進行卷積操作,過濾器從圖像的最左上角像素移動到最右下角像素。
for d in range(len(image[0][0])): for i in range(len(image)): for j in range(len(image[0])): output[i][j][d] = sum(sum(np.multiply(imfilter,pad_mat[i:i+flt_dim1,j:j+flt_dim2,d])))
gen_hybrid_image()
函數解釋
使用濾波器得到第一張圖像的低通濾波和第二張圖像的高通濾波,並加以混合
輸入參數
- 圖一,提供低通濾波
- 圖二,提供高通濾波
- 高斯模糊函數的標準差
輸出參數
- 通過圖一得到的低通濾波圖
- 通過圖二得到的高通濾波圖
- 圖一得到的低通濾波和圖二得到的高通濾波的混合圖
主要實現步驟
- 設置高斯模糊過濾器,高斯模糊在各個方向上具有普適性
gaussian_filter = gauss2D(shape=(cutoff_frequency*4+1,cutoff_frequency*4+1), sigma = cutoff_frequency)
- 使圖一通過高斯模糊濾波器以去除高頻信號,從而得到圖一的低通濾波圖
low_frequencies = my_imfilter(image1, gaussian_filter) # Remove the high frequencies from image1 by blurring it
- 使圖二通過高斯模糊濾波器以去除高頻信號,從而得到圖二的低通濾波圖,再拿圖二的原始圖與該圖做減法,就得到圖二的高通濾波圖
high_frequencies = image2 - my_imfilter(image2, gaussian_filter) # Remove the low frequencies from image2
將圖一的低通濾波圖和圖二的高通濾波圖進行相加得到最終的混合圖
hybrid_image = low_frequencies+high_frequencies # Combine
return low_frequencies,high_frequencies,hybrid_image
實驗步驟
- 讀取圖片路徑,並對圖像進行預處理操作
- 將預處理後的圖像進行濾波操作和融合操作
- 按照項目要求進行輸出圖像的保存操作
if __name__ == "__main__":
image1,image2,main_path=setup_image(img1_name,img2_name)
low_frequencies,high_frequencies,hybrid_image=gen_hybrid_image(image1, image2, cutoff_frequency)
save_image(main_path,low_frequencies,high_frequencies,hybrid_image,img1_name,img2_name)
結果展示
數據預覽
參考文獻
Project 1: Image Filtering and Hybrid Images
CS 143: Introduction to Computer Vision