1.图像阈值threshold
ladaptiveThreshold(
Mat src, // 输入的灰度图像
Mat dst, // 二值图像
double maxValue, // 二值图像最大值
int adaptiveMethod // 自适应方法,只能其中之一 –
// ADAPTIVE_THRESH_MEAN_C , ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType,// 阈值类型
int blockSize, // 块大小
double C // 常量C 可以是正数,0,负数
)
阈值类型详解:https://blog.csdn.net/weixin_42296411/article/details/80901080
案例:
adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
treshold函数
/*图像金字塔*/
#include"pch.h"
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat src, dst, gray_src;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
string output_title = "output";
void threshold_demo(int, void*);
int main(int argc, char** argv) {
src = imread("test.png");
if (!src.data) {
printf("没找到图像");
return-1;
}
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold Value:", output_title, &threshold_value, threshold_max, threshold_demo);
createTrackbar("Type Value:", output_title, &type_value, type_max, threshold_demo);
threshold_demo(0, 0);
cvtColor(src, gray_src, CV_RGB2GRAY);
namedWindow("gray_src", CV_WINDOW_AUTOSIZE);
imshow("gray_src", gray_src);
waitKey(0);
return 0;
}
void threshold_demo(int, void*) {
cvtColor(src, gray_src, CV_RGB2GRAY);
threshold(gray_src, dst,threshold_value,255,type_value);
imshow(output_title, dst);
}
图像阈值比较常用于简单的图像分割,其中六种类型中ostu(最小类间方差)和triangle算法是自动寻找阈值的算法。
结果:
2.图像金字塔
图像金字塔里面包含比较复杂的信号插值和采样知识以及小波变换知识,想要了解透彻需要秃头,先欠着,学个API先吧。
金字塔英文 :pyramid
高斯金字塔 – 用来对图像进行降采样
拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片
高斯金子塔是从底向上,逐层降采样得到。
降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
高斯金子塔的生成过程分为两步:
- 对当前层进行高斯模糊
- 删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
Difference of Gaussian-DOGl定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,称为高斯不同(DOG),高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。
上采样(cv::pyrUp) – zoom in 放大 pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2))
降采样 (cv::pyrDown) – zoom out 缩小 pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
代码:
/*图像金字塔*/
#include"pch.h"
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src,dst, up_dst, down_dst, dst1, dst2,gray_src;
src = imread("test.png");
if (!src.data) {
printf("没找到图像");
return-1;
}
pyrDown(src, down_dst, Size(src.cols / 2, src.rows / 2));//Size默认先列后行
pyrUp(src, up_dst, Size(src.cols * 2, src.rows *2));
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
namedWindow("zoom out", CV_WINDOW_AUTOSIZE);
imshow("zoom out", up_dst);
namedWindow("zoom in", CV_WINDOW_AUTOSIZE);
imshow("zoom in", down_dst);
/*DOG*/
cvtColor(src, gray_src, CV_RGB2GRAY);
GaussianBlur(gray_src, dst1, Size(3, 3), 0, 0);
GaussianBlur(gray_src, dst2, Size(7, 7), 0, 0);
subtract(dst1, dst2, dst, Mat());
normalize(dst, dst, 0, 255, NORM_MINMAX);//放大差值便于观察
namedWindow("dog", CV_WINDOW_AUTOSIZE);
imshow("dog", dst);
waitKey(0);
return 0;
}
结果如下: