系列文章目录
文章目录
前言
该篇主要讲解图像金字塔、高斯不同和图像阈值;
图像金字塔有上采样和降采样;
图像阈值类型有阈值二值化、阈值反二值化、截断、阈值取零和阈值反取零等
一、相关概念概念
1.图像金字塔
图像处理中常常会调整图像大小,最常见的就是放大和缩小,分别对应图像金字塔的下采样和上采样,常见的图像金字塔如下;
高斯金子塔:用来对图像进行降采样,参照下图,从底向上,逐层降采样;降采样之后图像大小是原图像M × N的M/2 × N/2,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
主要分为两步:
1、对当前层进行高斯模糊
2、删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
拉普拉斯金字塔: 用来重建一张图片根据它的上层降采样图片
2.高斯不同
把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,称为高斯不同; 高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。3.图像阈值类型
简单来说,阈值类型就是把图像分割的标尺,不同阈值类型的衡量算法不同阈值二值化(THRESH_BINARY):左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值,大于阈值的像素值赋值最大像素值,其他赋值0
阈值反二值化(THRESH_BINARY_INV):和阈值二值化刚好相反,大于阈值的像素值赋值0,其他赋值最大像素值
截断(THRESH_TRUNC):大于阈值的像素值进行截断,赋值阈值,其他像素值不变
阈值取零(THRESH_TOZERO):小于阈值的像素值进行截断,赋值0,其他像素值不变
阈值反取零(THRESH_TOZERO_INV):和阈值取零刚好相反,大于阈值的像素值进行截断,赋值0,其他像素值不变
二、图像金字塔和高斯不同
1.上采样(cv::pyrUp) – 放大
// 功能:向上采样图像,然后使其模糊
// 参数:src 输入图像
// dst 输出图像,它具有指定的大小和与src相同的类型;
// dstsize 输出图像的大小
// borderType 像素外推方法,请参见枚举类型#BorderTypes
//
void pyrUp( InputArray src, OutputArray dst,
const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
2.降采样 (cv::pyrDown) – 缩小
// 功能:向下进行采样,然后使其模糊
// 参数:src 输入图像
// dst 输出图像,它具有指定的大小和与src相同的类型;
// dstsize 输出图像的大小
// borderType 像素外推方法,请参见枚举类型#BorderTypes
void pyrDown( InputArray src, OutputArray dst,
const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
3.代码示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(void)
{
Mat srcImg, upImg, downImg;
srcImg = imread("E:\\1.png");
if (srcImg.empty())
{
cout << "load image fail..." << endl;
return -1;
}
imshow("输入图像", srcImg);
// 上采样:生成的图像是原图在宽与高各放大两倍
pyrUp(srcImg, upImg, Size(srcImg.cols * 2, srcImg.rows * 2));
imshow("上采样", upImg);
// 降采样:生成的图像是原图在宽与高各缩小1/2
pyrDown(srcImg, upImg, Size(srcImg.cols / 2, srcImg.rows / 2));
imshow("降采样", upImg);
Mat grayImg, gaussianImg1, gaussianImg2, dogImg;
// 转灰度
cvtColor(srcImg, grayImg, COLOR_BGR2GRAY);
// 高斯模糊
GaussianBlur(grayImg, gaussianImg1, Size(5, 5), 0, 0);
GaussianBlur(gaussianImg1, gaussianImg2, Size(5, 5), 0, 0);
// 高斯不同:把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像
subtract(gaussianImg1, gaussianImg2, dogImg);
// PS:高斯不同计算得到的值非常低,反映灰度值时,所以灰度也很低,所以整个图就很暗,所以
// 需要将最大和最小值放大0-255这个空间,才能看清楚
// 功能:归一化图像的数值范围
// 参数:src 输入图像
// dst 与src大小相同的输出图像
// alpha 归一化操作的最低范围
// beta 归一化操作的范围上限
// norm_type 标准化类型(请参见cv::NormalType)
// 其他参数 默认
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
imshow("高斯不同", dogImg);
waitKey(0);
return 0;
}
三、图像阈值类型
代码示例如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// 当前阈值
int g_iCurThresholdValue = 160;
// 最大阈值
int g_iMaxThresholdValue = 255;
// 当前阈值类型
int g_iCurThresholdType = 0;
// 阈值类型数量
int g_iMaxThresholdType = 5;
char g_szWinTitle[] = "输出图像";
void ThresholdBinaryDemo(int, void* pUserData)
{
Mat img = *((Mat*)pUserData);
Mat grayImg, dstImg;
cvtColor(img, grayImg, COLOR_BGR2GRAY);
// 功能:对每个数组元素应用一个固定的级别阈值
// 参数:src 输入数组(多通道,8位或32位浮点)。
// dst 输出数组的大小和类型与src的通道数相同。
// thresh 阈值
// maxval 用于 #THRESH_BINARY 和 #THRESH_BINARY_INV 类型的最大值。
// type 阈值类型,(请参见#ThresholdTypes)
threshold(grayImg, dstImg, g_iCurThresholdValue, g_iMaxThresholdValue, g_iCurThresholdType % g_iMaxThresholdType);
/****************************自动计算阈值****************************/
// 利用Otsu算法选择最优阈值,输入的阈值不再有效
//threshold(grayImg, dstImg, 0, g_iMaxThresholdValue, THRESH_OTSU | (g_iCurThresholdType % g_iMaxThresholdType));
// 利用三角形算法选择最优阈值,输入的阈值不再有效
//threshold(grayImg, dstImg, 0, g_iMaxThresholdValue, THRESH_TRIANGLE | (g_iCurThresholdType % g_iMaxThresholdType));
imshow(g_szWinTitle, dstImg);
}
int main(void)
{
Mat srcImg;
srcImg = imread("E:\\1.png");
if (srcImg.empty())
{
cout << "load image fail..." << endl;
return -1;
}
imshow("输入图像", srcImg);
namedWindow(g_szWinTitle, WINDOW_AUTOSIZE);
// 当前阈值大小
createTrackbar("阈值大小", g_szWinTitle, &g_iCurThresholdValue, g_iMaxThresholdValue, ThresholdBinaryDemo, (void*)&srcImg);
// 阈值类型
// THRESH_BINARY = 0,
// THRESH_BINARY_INV = 1,
// THRESH_TRUNC = 2,
// THRESH_TOZERO = 3,
// THRESH_TOZERO_INV = 4,
createTrackbar("阈值类型", g_szWinTitle, &g_iCurThresholdType, g_iMaxThresholdType, ThresholdBinaryDemo, (void*)&srcImg);
ThresholdBinaryDemo(0, (void*)&srcImg);
waitKey(0);
return 0;
}