一、什么是圖像濾波
圖像濾波是一種常見的圖像處理技術(shù),用于平滑圖像,去除噪聲和邊緣檢測等任務(wù)。其工作的原理是通過提前設(shè)定濾波器,將濾波器作用與原圖像,得到擁有需要的濾波效果的圖像。
一般圖像濾波分為平滑類:均值濾波;去噪類:中值濾波;突出邊緣:雙邊濾波;等。
二、均值濾波
1. 均值濾波原理
通過計算像素周圍鄰域內(nèi)像素值的平均值來代替該像素的值。
類似上圖,如果卷積是一個3*3的矩陣,那么矩陣濾波中每一個矩陣元素都為1/9。
(1) 一維信號
在前一篇文章**“圖像構(gòu)成與信號處理之二——濾波(信號部分)”**中,已經(jīng)介紹過“算術(shù)平均濾波法”: o u t p u t = s u m ( i n p u t ) / l e n ( i n p u t ) output = sum(input) / len(input) output=sum(input)/len(input)
(2)二維圖像信號
均值濾波也可以表示成類似的公式 I f i l t e r e d [ x , y ] = m e a n ( I [ x + i , y + j ] ) I_{filtered}[x,y]=mean(I[x+i,y+j]) Ifiltered?[x,y]=mean(I[x+i,y+j]),其中I_filtered[x, y] 是濾波后的像素值,I[x+i, y+j] 是原始圖像的像素值。
2. 均值濾波實現(xiàn)
(1)OpenCV在C++與Python中的實現(xiàn)
下列代碼示例分別是C++和Python使用OpenCV模塊進行均值濾波的示例。均值濾波使用一個滑動窗口覆蓋圖像的區(qū)域,然后計算窗口內(nèi)像素的平均值,并將該平均值作為中心像素的新值。
#include <opencv2/opencv.hpp>
int main() {
// 讀取圖像
cv::Mat image = cv::imread("path/to/your/image.jpg", cv::IMREAD_COLOR);
if (image.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 定義濾波器的大小
int kernel_size = 11; // 奇數(shù)值,例如 3、5、7...
// 進行均值濾波
cv::Mat filtered_image;
cv::blur(image, filtered_image, cv::Size(kernel_size, kernel_size));
// 顯示原始圖像和濾波后的圖像
cv::imshow("Original Image", image);
cv::imshow("Filtered Image", filtered_image);
cv::waitKey(0);
return 0;
}
import cv2
# 讀取圖像
image = cv2.imread('path/to/your/image.jpg')
if image is None:
print("Could not read the image.")
else:
# 定義濾波器的大小
kernel_size = (11, 11) # 奇數(shù)值,例如 (3, 3)、(5, 5)、(7, 7)...
# 進行均值濾波
filtered_image = cv2.blur(image, kernel_size)
# 顯示原始圖像和濾波后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)實戰(zhàn)
圖像輸入
kernel=11
kernel=21
三、中值濾波
1. 中值濾波原理
中值濾波是把數(shù)字圖像或數(shù)字序列中一點的值用該點的一個鄰域中各點值的中值代替(因此鄰域的大小必須為奇奇*),讓周圍的像素值接近真實值,從而消除孤立的噪聲點。(類似下圖的例子)
類似上圖,如果卷積是一個3*3的矩陣,那么矩陣濾波中每一個矩陣元素分別為對應(yīng)矩陣中的中位數(shù)值。
(1) 一維信號
在前一篇文章**“圖像構(gòu)成與信號處理之二——濾波(信號部分)”**中,已經(jīng)介紹過“中位值濾波法”: o u t p u t = m e d i a n ( i n p u t ) output = median(input) output=median(input)
(2)二維圖像信號
均值濾波也可以表示成類似的公式 I f i l t e r e d [ x , y ] = m e d i a n ( I [ x + i , y + j ] ) I_{filtered}[x,y]=median(I[x+i,y+j]) Ifiltered?[x,y]=median(I[x+i,y+j]),其中I_filtered[x, y] 是濾波后的像素值,I[x+i, y+j] 是原始圖像的像素值。
2. 中值濾波實現(xiàn)
(1)OpenCV在C++與Python中的實現(xiàn)
下列代碼示例分別是C++和Python使用OpenCV模塊進行中值濾波的示例。中值濾波使用一個滑動窗口覆蓋圖像的區(qū)域,然后計算窗口內(nèi)像素的中位數(shù)值,并將該值作為中心像素的新值。
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("path/to/your/image.jpg", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
std::cout << "Failed to read image." << std::endl;
return -1;
}
cv::Mat filteredImage;
cv::medianBlur(image, filteredImage, 11); // 11表示濾波窗口大小,可以根據(jù)需要調(diào)整
cv::imshow("Original Image", image);
cv::imshow("Filtered Image", filteredImage);
cv::waitKey(0);
return 0;
}
import cv2
# 讀取圖像
image = cv2.imread('path/to/your/image.jpg')
if image is None:
print("Could not read the image.")
else:
# 定義濾波器的大?。ū仨殲槠鏀?shù))
kernel_size = 5 # 例如 3、5、7...
# 進行中值濾波
median_filtered_image = cv2.medianBlur(image, kernel_size)
# 顯示原始圖像和中值濾波后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', median_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)實戰(zhàn)(輸入圖片與上述實驗一樣)
kernel=11
kernel=21
四、高斯濾波
1. 高斯濾波原理
通過應(yīng)用高斯函數(shù)來計算像素周圍鄰域內(nèi)像素值的加權(quán)平均值,以此來代替該像素的值。詳細(xì)原理可以參考以下博客。
(63條消息) 高斯濾波_MingChaoSun的博客-CSDN博客
2. 高斯濾波實現(xiàn)
(1)OpenCV在C++與Python中的實現(xiàn)
下列代碼示例分別是C++和Python使用OpenCV模塊進行高斯濾波的示例。高斯濾波使用一個滑動窗口覆蓋圖像的區(qū)域,然后計算窗口內(nèi)像素的高斯函數(shù)數(shù)值,并將該值作為窗口的新值。
#include <iostream>
#include <opencv2/opencv.hpp>
usingnamespace cv;
usingnamespace std;
intmain()
{
Mat src= imread("lena.jpg");
if (src.empty())
{
cout<< "Could not open or find the image"<< endl;
return-1;
}
Mat dst1, dst2;
// 均值濾波
blur(src, dst1, Size(3, 3));
// 高斯濾波
GaussianBlur(src, dst2, Size(11, 11), 0);
imshow("Source Image", src);
imshow("Mean Filtered Image", dst1);
imshow("Gaussian Filtered Image", dst2);
waitKey();
return 0;
}
import cv2
# 讀取圖像
image = cv2.imread('path/to/your/image.jpg')
if image is None:
print("Could not read the image.")
else:
# 定義濾波器的大?。ū仨殲槠鏀?shù))
kernel_size = (5, 5) # 例如 (3, 3)、(5, 5)、(7, 7)...
# 定義高斯核的標(biāo)準(zhǔn)差
sigma_x = 0 # 標(biāo)準(zhǔn)差值,0表示根據(jù)核的大小自動計算
# 進行高斯濾波
gaussian_filtered_image = cv2.GaussianBlur(image, kernel_size, sigma_x)
# 顯示原始圖像和高斯濾波后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)實戰(zhàn)(輸入與上述濾波算法相同)
kernel=11
kernel=21
五、結(jié)論
通常情況下,濾波核越大,濾波效果會越平滑,但也可能導(dǎo)致圖像細(xì)節(jié)喪失或模糊。這是因為較大的核會考慮更多的像素,從而導(dǎo)致局部變化被更加平均化。
同時,較大的濾波核也可能導(dǎo)致處理時間增加,因為計算需要考慮更多的像素。因此,在選擇濾波核的大小時,需要權(quán)衡平滑效果、細(xì)節(jié)保留和計算效率。文章來源:http://www.zghlxwxcb.cn/news/detail-840870.html
以下是不同濾波核大小可能產(chǎn)生的效果:文章來源地址http://www.zghlxwxcb.cn/news/detail-840870.html
- 小核 (3x3 或 5x5):較小的核可以保留更多的細(xì)節(jié),但噪聲也可能被保留。適用于一些需要保留邊緣和細(xì)節(jié)的情況。
- 中等核 (7x7 或 9x9):這種大小的核可以在平滑和細(xì)節(jié)保留之間取得平衡,但可能會對某些細(xì)節(jié)造成一定程度的模糊。
- 大核 (11x11 或更大):較大的核會更強烈地平滑圖像,可能會使圖像看起來更加模糊。這在噪聲較多或需要強烈平滑的情況下可能很有用。
到了這里,關(guān)于圖像構(gòu)成與信號處理之三——圖像濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!