//图像金字塔
//上采样
pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
pyrDown(src, dst, Size(src.cols / 2, src.rows / 2));
//高斯不同
Mat g1, g2, gr, dogImg;
cvtColor(src, gr, CV_BGR2GRAY);
GaussianBlur(gr, g1, Size(5, 5), 0, 0);
GaussianBlur(g1, g2, Size(5, 5), 0, 0);
subtract(g1, g2, dogImg, Mat());
//sobel边缘检测
Mat gray_src;
GaussianBlur(src, dst, Size(3, 3), 0, 0);
cvtColor(dst, gray_src, CV_BGR2GRAY);
Mat xgrad, ygrad;
Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
convertScaleAbs(xgrad, xgrad);//取绝对值
convertScaleAbs(ygrad, ygrad);
Mat xygray;
//x,y分配权重
addWeighted(xgrad, 0.5, ygrad, 0.5,0, xygray,-1);
//分配权重,替换addweighted
xygray = Mat(xgrad.size(), xgrad.type());
int heigh = ygrad.rows;
int weigh = xgrad.cols;
for (int row = 0; row < heigh; row++)
{
for (int col = 0; col < weigh; col++)
{
int x = xgrad.at<char>(row, col);
int y = ygrad.at<char>(row, col);
int n = x + y;
xygray.at<char>(row, col) = saturate_cast<char>(n);
}
}
//another method 求边缘
Scharr(gray_src, xgrad, CV_16S, 1, 0);
Scharr(gray_src, ygrad, CV_16S, 0, 1);
//laplance边缘
Mat lap_img;
GaussianBlur(src, dst, Size(3, 3), 0, 0);
cvtColor(dst, gray_src, CV_BGR2GRAY);
Laplacian(gray_src, lap_img, CV_16S, 3);
convertScaleAbs(lap_img, lap_img);
threshold(lap_img, lap_img, 0, 255, THRESH_OTSU | THRESH_BINARY);
//canny 边缘
//高斯模糊、灰度、梯度(sobel,scharr)、非最大值抑制、阈值
Canny(gray_src, dst, 20, 40, 3, false);
//直方图均衡化,提高图像对比度
equalizeHist(src, dst);//src需为八位单通道图像
图像金字塔、边缘检测、图像加权显示、直方图均衡化
最新推荐文章于 2022-12-09 14:15:00 发布