1. 實驗目的
①掌握圖像空間濾波的主要原理與方法;
②掌握圖像邊緣提取的主要原理和方法;
③了解空間濾波在圖像處理和機器學習中的應用。
2. 實驗內容
①調用 Matlab / Python +OpenCV中的函數,實現均值濾波、高斯濾波、中值濾波等。
②調用 Matlab /Python + OpenCV中的函數,實現邊緣提取(Sobel、Robert、Laplacian、Prewitt、Canny等)。
③在Matlab/Python +OpenCV中,編程實現均值濾波,高斯濾波和中值濾波。
3. 實驗過程
3.1 圖像添加噪聲
使用Matlab/Python +OpenCV中的加噪聲函數,分別給同一幅圖像中加入不同比例的高斯噪聲、椒鹽噪聲、泊松噪聲,并在圖像中添加直線等干擾。
① 請填寫以下函數對應的參數說明:
函數名 | 函數功能 | 參數說明 |
---|---|---|
J = imnoise(I, ‘gaussian’, m, v) | 添加高斯噪聲 | I:輸入圖像。 'gaussian':指定添加高斯噪聲。 m:高斯分布的均值。 v:高斯分布的方差 |
J = imnoise(I, ‘salt & pepper’, d) | 添加椒鹽噪聲 | I:輸入圖像。 'salt & pepper':指定添加椒鹽噪聲。 d:控制噪聲密度的參數,取值范圍為0到1之間,表示噪聲像素占總像素數的比例。 |
J = imnoise(I, ‘poisson’) | 添加泊松噪聲 | I:輸入圖像。 'poisson':指定添加泊松噪聲。 |
%實驗4-1 為圖像添加噪聲
% 讀取圖像
image = imread('lena.png');
image_gray = rgb2gray(image);% 添加高斯噪聲
gaussian_noise_image = imnoise(image_gray, 'gaussian', 0, 0.01);% 添加椒鹽噪聲
salt_pepper_noise_image = imnoise(image_gray, 'salt & pepper', 0.05);%泊松
% 將圖像轉換為雙精度類型
image_gray_double = im2double(image_gray);
% 計算泊松噪聲參數
lambda = 0.1 * mean(image_gray_double(:)); % 泊松分布的平均值
% 生成泊松噪聲
poisson_noise = poissrnd(lambda, size(image_gray_double));
% 添加泊松噪聲
poisson_noise_image_double = image_gray_double + poisson_noise;
% 將圖像還原為8位無符號整數類型
poisson_noise_image = im2uint8(poisson_noise_image_double);% 添加直線干擾
line_interference_image = insertShape(image_gray, 'Line', [1 1 size(image_gray,2) size(image_gray,2)], 'Color', 'white', 'LineWidth', 1);% 顯示原始圖像和添加不同噪聲的圖像
figure;
subplot(2, 2, 1);
imshow(image_gray);
title('原始圖像');
subplot(2, 2, 2);
imshow(gaussian_noise_image);
title('高斯噪聲');
subplot(2, 2, 3);
imshow(salt_pepper_noise_image);
title('椒鹽噪聲');
subplot(2, 2, 4);
imshow(poisson_noise_image);
title('泊松噪聲');% 顯示添加直線干擾后的圖像
figure;
imshow(line_interference_image);
title('直線干擾');
③ 結果對比與分析(觀察對比不同類型、參數噪聲的特點)
高斯噪聲(Gaussian Noise):
特點:高斯噪聲是一種服從高斯分布(也稱為正態分布)的隨機噪聲。它是一種連續性的噪聲,呈現為圖像中的隨機亮度變化。
形成原因:高斯噪聲可以由許多因素引起,例如電子設備的電子噪聲、圖像傳感器的固有噪聲等。
效果:高斯噪聲對圖像的影響主要體現在圖像的平滑程度上,它會使圖像的細節模糊化。
椒鹽噪聲(Salt and Pepper Noise):
特點:椒鹽噪聲是一種隨機的、突發的噪聲,表現為圖像中出現亮白或暗黑的孤立像素點。
形成原因:椒鹽噪聲可能是因為信號損壞或傳輸錯誤導致像素值發生突變引起的。
效果:椒鹽噪聲會在圖像中引入明顯的孤立像素點,使圖像出現突然的亮點或暗點。
泊松噪聲(Poisson Noise):
特點:泊松噪聲是由于光子計數的隨機性導致的一種噪聲。它在低光條件下的圖像中更為常見。
形成原因:泊松噪聲主要是由于光照條件下的隨機光子計數引起的,例如低照度圖像中的光子計數變化。
效果:泊松噪聲會導致圖像的亮度變化和細節的模糊,尤其在低光條件下會更加明顯。
3.2 圖像平滑
使用 Matlab/Python +OpenCV中的相關函數,對3.1中加噪的圖像進行均值濾波、高斯濾波和中值濾波。
① 請填寫以下函數對應的參數說明:
② 源代碼及實驗結果(添加必要注釋)
%實驗4-2 圖像去除噪聲實驗
% 讀取圖像
image = imread('lena.png');
image_gray = rgb2gray(image);% 添加高斯噪聲
gaussian_noise_image = imnoise(image_gray, 'gaussian', 0, 0.01);% 中值濾波
median_filtered = medfilt2(gaussian_noise_image, [3 3]);
% 均值濾波
mean_filtered = imfilter(gaussian_noise_image, fspecial('average', [3 3]));% 高斯濾波
gaussian_filtered = imfilter(gaussian_noise_image, fspecial('gaussian', [4 4], 2));% 顯示原始圖像和濾波后的圖像
figure;
subplot(2, 2, 1), imshow(gaussian_noise_image), title('原始圖像');
subplot(2, 2, 2), imshow(mean_filtered), title('均值濾波');
subplot(2, 2, 3), imshow(gaussian_filtered), title('高斯濾波');
subplot(2, 2, 4), imshow(median_filtered), title('中值濾波');
③ 實驗結果對比與分析
對比不同類型和尺寸的濾波器的實驗結果,分析原因,并總結對于含有不同噪聲圖像,如何選擇合適的濾波器,可以達到較好的去噪和平滑效果。
對添加了高斯噪聲的圖像進行消噪處理,不同的消噪方法效果不一。應針對不同噪聲選擇不同的濾波器。
3.3 百分比濾波
使用 Matlab/Python +OpenCV中的相關函數,對原圖和加噪的圖像分別進行中值濾波、最大值濾波和最小值濾波。
① 請填寫使用到的函數以及參數說明:
② 源代碼及實驗結果(添加必要注釋)
%實驗4—3 對圖像進行中值濾波、最大值濾波和最小值濾波。
% 讀取原圖像
image = imread('lena.png');
original_image = rgb2gray(image);
% 生成加噪圖像(這里假設添加了椒鹽噪聲)
noisy_image = imnoise(original_image, 'salt & pepper', 0.1);% 中值濾波
median_filtered_original = medfilt2(original_image, [3 3]);
median_filtered_noisy = medfilt2(noisy_image, [3 3]);% 最大值濾波
max_filtered_original = ordfilt2(original_image, 9, ones(3, 3));
max_filtered_noisy = ordfilt2(noisy_image, 9, ones(3, 3));% 最小值濾波
min_filtered_original = ordfilt2(original_image, 1, ones(3, 3));
min_filtered_noisy = ordfilt2(noisy_image, 1, ones(3, 3));% 顯示原始圖像和濾波后的圖像
figure;
subplot(3, 2, 1), imshow(original_image), title('原始圖像');
subplot(3, 2, 2), imshow(median_filtered_original), title('中值濾波(原始圖像)');
subplot(3, 2, 3), imshow(original_image), title('原始圖像');
subplot(3, 2, 4), imshow(min_filtered_original), title('最小值濾波(原始圖像)');
subplot(3, 2, 5), imshow(original_image), title('原始圖像');
subplot(3, 2, 6), imshow(max_filtered_original), title('最大值濾波(原始圖像)');figure;
subplot(3, 2, 1), imshow(noisy_image), title('加噪圖像');
subplot(3, 2, 2), imshow(max_filtered_noisy), title('最大值濾波(加噪圖像)');
subplot(3, 2, 3), imshow(noisy_image), title('加噪圖像');
subplot(3, 2, 4), imshow(median_filtered_noisy), title('中值濾波(加噪圖像)');
subplot(3, 2, 5), imshow(noisy_image), title('加噪圖像');
subplot(3, 2, 6), imshow(min_filtered_noisy), title('最小值濾波(加噪圖像)');
③ 實驗結果對比與分析
觀察實驗結果,分析原因,思考中值濾波、最大值濾波和最小值濾波可能的應用場景。
1.中值濾波(Median Filter):
中值濾波主要用于去除圖像中的椒鹽噪聲(Salt-and-Pepper Noise)。當圖像受到高斯模糊或攝像機移動等因素的影響時,可能會出現椒鹽噪聲。中值濾波通過取像素周圍鄰域內的中值來消除噪聲,保留圖像的邊緣信息。因此,適用于去除高斯噪聲或降低圖像噪聲的場景。
2.最大值濾波(Maximum Filter):
最大值濾波主要用于增強圖像的對比度。當圖像的亮度分布不均勻時,可以通過最大值濾波來突出圖像中的最大亮度值,使得圖像的整體亮度更加均勻。因此,適用于調整光照不均或需要增強圖像對比度的場景。
3.最小值濾波(Minimum Filter):
最小值濾波與最大值濾波相反,它主要用于減弱圖像的對比度。當圖像的亮度分布不均勻時,可以通過最小值濾波來突出圖像中的最小亮度值,使得圖像的整體亮度更加均勻。因此,適用于調整光照不均或需要減弱圖像對比度的場景。
3.4 邊緣提取和圖像銳化
使用 Matlab / Python +OpenCV中的邊緣提取函數,分別提取圖像的Sobel、Robert、Laplacian、Prewitt、Canny邊緣。
① 請填寫使用到的函數以及參數說明:
② 邊緣提取
源代碼及實驗結果(源代碼添加必要注釋,結果展示使用不同邊緣提取算子的效果)
% 實驗4—4 圖像的邊緣提取
% 讀取圖像
image = imread('lena.png');% 將圖像轉換為灰度圖像(如果原始圖像是彩色圖像)
gray_image = rgb2gray(image);% 使用Sobel算子進行邊緣提取
sobel_edge = edge(gray_image, 'Sobel');% 使用Robert算子進行邊緣提取(當前版本不支持該算子)
%robert_edge = edge(gray_image, 'Robert');% 使用Laplacian算子進行邊緣提取
laplacian_edge = edge(gray_image, 'log');% 使用Prewitt算子進行邊緣提取
prewitt_edge = edge(gray_image, 'Prewitt');% 使用Canny算子進行邊緣提取
canny_edge = edge(gray_image, 'Canny');% 顯示原始圖像和邊緣提取結果
subplot(2, 3, 1), imshow(image), title('Original Image');
subplot(2, 3, 2), imshow(sobel_edge), title('Sobel Edge');
%subplot(2, 3, 3), imshow(robert_edge), title('Robert Edge');
subplot(2, 3, 4), imshow(laplacian_edge), title('Laplacian Edge');
subplot(2, 3, 5), imshow(prewitt_edge), title('Prewitt Edge');
subplot(2, 3, 6), imshow(canny_edge), title('Canny Edge');
③ 圖像銳化
源代碼及實驗結果(源代碼添加必要注釋,結果展示使用不同邊緣提取算子的效果)使用邊緣提取的結果,對圖像進行銳化。
%實驗4—5 圖像的銳化
% 讀取圖像
image = imread('lena.png');% 將圖像轉換為灰度圖像(如果原始圖像是彩色圖像)
gray_image = rgb2gray(image);% 定義銳化濾波器
sharp_filter = [0 -1 0; -1 5 -1; 0 -1 0];% 應用銳化濾波器
sharpened_image = imfilter(gray_image, sharp_filter);% 調整銳化結果的對比度
sharpened_image = imadjust(sharpened_image);% 顯示原始圖像和銳化結果
subplot(1, 2, 1), imshow(gray_image), title('原始圖像');
subplot(1, 2, 2), imshow(sharpened_image), title('銳化圖像');
④ 實驗結果對比與分析
對比實驗結果結果,分析原因,并總結不同邊緣提取算法的特點和適用情況。
Sobel算子:
特點:Sobel算子使用一階導數來檢測圖像中的邊緣,對噪聲有一定的抵抗能力。它分別計算水平和垂直方向的梯度,并將它們合并成一個梯度值。
適用情況:Sobel算子適用于檢測較明顯的邊緣,尤其是具有明顯方向性的邊緣,如圖像中的邊界和輪廓。
Prewitt算子:
特點:Prewitt算子與Sobel算子類似,也使用一階導數來檢測圖像中的邊緣。它分別計算水平和垂直方向的梯度,并將它們合并成一個梯度值。
適用情況:Prewitt算子適用于檢測邊緣,尤其是在具有明顯方向性的邊緣的情況下。
Laplacian算子:
特點:Laplacian算子使用二階導數來檢測圖像中的邊緣。它對邊緣的精確位置和方向有更好的響應,并且可以檢測到更細微的邊緣變化。
適用情況:Laplacian算子適用于檢測細微的邊緣和紋理變化,但對噪聲比較敏感。
Canny算子:
特點:Canny算子是一種多階段的邊緣檢測算法,具有很好的性能。它首先使用高斯濾波器進行平滑處理,然后計算梯度,然后通過非極大值抑制和雙閾值處理來提取邊緣。
適用情況:Canny算子適用于需要高質量邊緣檢測的情況,對噪聲有較好的抵抗能力,并且可以調整閾值以控制檢測到的邊緣數量。
3.5 自定義函數實現圖像濾波
⑴不調用Matlab / OpenCV中的函數,編程實現圖像的均值濾波,高斯濾波和中值濾波。
⑵與3.2、3.3的實驗結果進行對比,觀察實驗結果是否相同,分析原因并改進、優化所編寫程序。
⑶將所編寫程序段封裝為自定義函數。
① 均值濾波
源代碼及實驗結果 (添加必要注釋)
def mean_filter(image, kernel_size):"""均值濾波函數:param image: 輸入圖像:param kernel_size: 濾波器大小:return: 濾波后的圖像"""width, height = image.shapefiltered_image = np.zeros_like(image)padding = kernel_size // 2padded_image = np.pad(image, ((padding, padding), (padding, padding)), mode='constant')for i in range(padding, width + padding):for j in range(padding, height + padding):neighborhood = padded_image[i - padding:i + padding + 1, j - padding:j + padding + 1]filtered_image[i - padding, j - padding] = np.mean(neighborhood)return filtered_image
② 高斯濾波
def gaussian_filter(image, kernel_size, sigma):"""高斯濾波函數:param image: 輸入圖像:param kernel_size: 濾波器大小:param sigma: 高斯核的標準差:return: 濾波后的圖像"""width, height = image.shapefiltered_image = np.zeros_like(image)padding = kernel_size // 2padded_image = np.pad(image, ((padding, padding), (padding, padding)), mode='constant')kernel = gaussian_kernel(kernel_size, sigma)for i in range(padding, width + padding):for j in range(padding, height + padding):neighborhood = padded_image[i - padding:i + padding + 1, j - padding:j + padding + 1]filtered_image[i - padding, j - padding] = np.sum(neighborhood * kernel)return filtered_image
③ 中值濾波:
def median_filter(image, kernel_size):"""中值濾波函數:param image: 輸入圖像:param kernel_size: 濾波器大小:return: 濾波后的圖像"""width, height = image.shapefiltered_image = np.zeros_like(image)padding = kernel_size // 2padded_image = np.pad(image, ((padding, padding), (padding, padding)), mode='constant')for i in range(padding, width + padding):for j in range(padding, height + padding):neighborhood = padded_image[i - padding:i + padding + 1, j - padding:j + padding + 1]filtered_image[i - padding, j - padding] = np.median(neighborhood)return filtered_image
4. 實驗小結
①在PhotoShop中找一找,有哪些功能是通過圖像空間濾波實現的。
答:模糊/平滑濾波:通過應用均值濾波、高斯濾波或其他模糊濾波器來減少圖像的細節和噪點,從而使圖像更加平滑。
銳化濾波:通過應用銳化濾波器(如拉普拉斯濾波器)來增強圖像的邊緣和細節,使圖像更加清晰和銳利。
邊緣檢測:通過應用邊緣檢測濾波器(如Sobel、Prewitt或Canny)來檢測圖像中的邊緣和輪廓,以突出圖像中的邊界信息。
噪點去除:通過應用中值濾波器或其他噪點去除濾波器來減少圖像中的椒鹽噪點、高斯噪點或其他類型的噪點。
高動態范圍(HDR)合成:通過應用圖像空間濾波器和曝光調整來合成具有高動態范圍的圖像,以獲得更廣泛的亮度范圍和更豐富的細節。
美顏和皮膚磨皮:通過應用柔化和模糊濾波器來減少皮膚上的細紋和瑕疵,實現美顏和皮膚磨皮效果。
②分析和總結3.2、3.3、3.4的實驗結果,能夠得到哪些啟發或結論?
答:針對不同的圖像和預期效果,可以選擇不同的處理方案
③為了方便復用3.5的自定義函數,應該怎樣設計和封裝更加合理?你還能想到哪些進一步改進和優化的方法?
答:考慮多種不同的圖像的濾波方案,同時設計良好的濾波思路,提高程序的魯棒性。
④根據實驗內容和結果,并查找相關資料,想一想,圖像卷積在數字圖像處理、機器學習、深度學習中有哪些應用?
答:圖像濾波:圖像卷積可以用于應用各種濾波器來實現圖像平滑、邊緣增強、噪點去除等操作。常見的濾波器包括均值濾波、高斯濾波、中值濾波等。
特征提取:在機器學習和計算機視覺任務中,圖像卷積被廣泛用于提取圖像的特征。通過應用不同的卷積核,可以捕捉到圖像中的邊緣、紋理、形狀等特征,為后續的分類、目標檢測、分割等任務提供輸入。
目標檢測:在目標檢測任務中,卷積神經網絡(CNN)是一種常用的深度學習模型,它利用圖像卷積層來提取圖像特征,并通過后續的分類和回歸層來識別圖像中的目標物體。
圖像分割:卷積神經網絡也被廣泛用于圖像分割任務,通過對圖像進行卷積操作,將圖像劃分為不同的區域或像素,并將每個區域或像素分配給特定的類別。
圖像超分辨率:圖像卷積在圖像超分辨率重建中有應用。通過將低分辨率圖像進行卷積和上采樣操作,可以生成高分辨率的圖像。
圖像風格轉換:卷積神經網絡可以通過卷積操作來學習不同風格圖像之間的特征表示,從而實現圖像風格的轉換。
圖像增強:卷積神經網絡可以通過卷積操作來學習圖像增強的映射函數,從而改善圖像的質量、對比度或顏色等方面。