From 275a44cfc883bb64270ff842230007a430ddd250 Mon Sep 17 00:00:00 2001 From: biss Date: Thu, 19 Mar 2026 19:16:42 +0800 Subject: [PATCH] blur & threshold --- Blur/bilateral.cpp | 14 ++++++++++++++ Blur/blur.cpp | 13 +++++++++++++ Blur/gauss.cpp | 14 ++++++++++++++ Blur/median.cpp | 13 +++++++++++++ Threshold/adaptive.cpp | 15 +++++++++++++++ Threshold/auto.cpp | 18 ++++++++++++++++++ Threshold/simple.cpp | 20 ++++++++++++++++++++ 7 files changed, 107 insertions(+) create mode 100644 Blur/bilateral.cpp create mode 100644 Blur/blur.cpp create mode 100644 Blur/gauss.cpp create mode 100644 Blur/median.cpp create mode 100644 Threshold/adaptive.cpp create mode 100644 Threshold/auto.cpp create mode 100644 Threshold/simple.cpp diff --git a/Blur/bilateral.cpp b/Blur/bilateral.cpp new file mode 100644 index 0000000..6fcd78e --- /dev/null +++ b/Blur/bilateral.cpp @@ -0,0 +1,14 @@ +#include + +int main() { + cv::Mat src = cv::imread("image.jpg"); + cv::Mat dst; + + // 参数:输入, 输出, 邻域直径, 颜色空间标准差, 坐标空间标准差 + // 颜色标准差越大,表示越宽的颜色范围会被混合 + cv::bilateralFilter(src, dst, 9, 75, 75); + + cv::imshow("Bilateral Filter", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Blur/blur.cpp b/Blur/blur.cpp new file mode 100644 index 0000000..845dc42 --- /dev/null +++ b/Blur/blur.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + cv::Mat src = cv::imread("../img/2.jpg"); + cv::Mat dst; + + // 参数:输入, 输出, 卷积核大小 Size(w, h) + cv::blur(src, dst, cv::Size(5, 5)); + + cv::imshow("Mean Blur", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Blur/gauss.cpp b/Blur/gauss.cpp new file mode 100644 index 0000000..bc3b3e3 --- /dev/null +++ b/Blur/gauss.cpp @@ -0,0 +1,14 @@ +#include + +int main() { + cv::Mat src = cv::imread("image.jpg"); + cv::Mat dst; + + // 参数:输入, 输出, 核大小, sigmaX(标准差), sigmaY + // 如果 sigmaY 为 0,则默认与 sigmaX 相等 + cv::GaussianBlur(src, dst, cv::Size(5, 5), 0); + + cv::imshow("Gaussian Blur", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Blur/median.cpp b/Blur/median.cpp new file mode 100644 index 0000000..3615a3d --- /dev/null +++ b/Blur/median.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + cv::Mat src = cv::imread("image.jpg"); + cv::Mat dst; + + // 参数:输入, 输出, 核大小(必须是大于1的奇数整数,如3, 5, 7) + cv::medianBlur(src, dst, 5); + + cv::imshow("Median Blur", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Threshold/adaptive.cpp b/Threshold/adaptive.cpp new file mode 100644 index 0000000..976f6be --- /dev/null +++ b/Threshold/adaptive.cpp @@ -0,0 +1,15 @@ +#include + +int main() { + cv::Mat img = cv::imread("../img/2.jpg", cv::IMREAD_GRAYSCALE); + if (img.empty()) return -1; + + cv::Mat dst; + // 参数依次为:输入, 输出, 最大值, 自适应方法, 阈值类型, 邻域大小(须为奇数), 常数C + cv::adaptiveThreshold(img, dst, 255, cv::ADAPTIVE_THRESH_MEAN_C, + cv::THRESH_BINARY, 11, 2); + + cv::imshow("Adaptive Threshold", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Threshold/auto.cpp b/Threshold/auto.cpp new file mode 100644 index 0000000..a385b64 --- /dev/null +++ b/Threshold/auto.cpp @@ -0,0 +1,18 @@ +#include +#include + +int main() { + cv::Mat img = cv::imread("../img/2.jpg", cv::IMREAD_GRAYSCALE); + if (img.empty()) return -1; + + cv::Mat dst; + // 注意:使用 THRESH_OTSU 时,输入的 thresh 参数 (0) 会被忽略 + // 它是通过 “标志位组合” 来实现的:cv::THRESH_BINARY | cv::THRESH_OTSU + double otsuThresh = cv::threshold(img, dst, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); + + std::cout << "Otsu 自动确定的阈值是: " << otsuThresh << std::endl; + + cv::imshow("Otsu Threshold", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file diff --git a/Threshold/simple.cpp b/Threshold/simple.cpp new file mode 100644 index 0000000..162b2ad --- /dev/null +++ b/Threshold/simple.cpp @@ -0,0 +1,20 @@ +#include +#include + +int main() { + // 读取灰度图 + cv::Mat img = cv::imread("../img/2.jpg", cv::IMREAD_GRAYSCALE); + if (img.empty()) return -1; + + cv::Mat dst; + double thresh = 127; + double maxVal = 255; + + // 简单阈值处理:二进制阈值 + // 返回值是处理时使用的阈值 + double ret = cv::threshold(img, dst, thresh, maxVal, cv::THRESH_BINARY); + + cv::imshow("Simple Threshold", dst); + cv::waitKey(0); + return 0; +} \ No newline at end of file