两种方法,全局固定阈值二值化和局部自适应阈值二值化
全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化;
局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat image = imread("moon.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意了,必须是载入灰度图
if (image.empty())
{
cout << "read image failure" << endl;
return -1;
}
// 全局二值化
int th = 100;
Mat global;
threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
// 局部二值化
int blockSize = 25;
int constValue = 10;
Mat local;
adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
imshow("原始图",image);
imshow("全局二值化", global);
imshow("局部二值化", local);
waitKey(0);
return 0;
}
效果:
//3.腐蚀操作
int main()
{
Mat SrcPic = imread("dog.jpg");
imshow("原图", SrcPic);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函数返回的是指定形状和尺寸的结构元素
Mat DstPic;
erode(SrcPic, DstPic, element); //腐蚀操作
imshow("腐蚀效果图", DstPic);
waitKey(0);
return 0;
}
模糊处理在边沿检测和去噪声方面有较为广泛的应用。OpenCV中提供了4种模糊算法,列举如下:
这里我们只列举使用 均值滤波实现图像模糊:
int main()
{
Mat SrcPic = imread("dog.jpg");
imshow("原图", SrcPic);
Mat DstPic;
blur(SrcPic, DstPic, Size(7, 7));
imshow("均值滤波", DstPic);
waitKey();
return 0;
}
更多模糊操作见这里
将原始图像转化为灰度图,用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测。
//canny边缘检测
int main()
{
Mat SrcPic = imread("dog.jpg");
imshow("原图", SrcPic);
Mat DstPic, edge, grayImage;
//创建与src同类型和同大小的矩阵
DstPic.create(SrcPic.size(), SrcPic.type());
//将原始图转化为灰度图
cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY);
//先使用3*3内核来降噪
blur(grayImage, edge, Size(3, 3));
//运行canny算子
Canny(edge, edge, 3, 9, 3);
imshow("边缘提取效果", edge);
waitKey();
return 0;
}
//6.直方图均衡化
int main()
{
Mat img = imread("dog.jpg");
imshow("原始图", img);
Mat dst;
cvtColor(img, img, CV_RGB2GRAY);
imshow("灰度图", img);
equalizeHist(img, dst);
imshow("直方图均衡化", dst);
waitKey(0);
}
显然均衡化后的图片对比度变高了,变得更加明亮!
最后简单总结一下图像处理中概念
离散傅里叶变换
图像高频部分代表了图像的细节、纹理信息;低频代表了图像的轮廓信息。
低通-》模糊
高通-》锐化
腐蚀和膨胀是针对白色部分(高亮部分)而言的。膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
开运算:先腐蚀再膨胀,用来消除小物体
闭运算:先膨胀再腐蚀,用于排除小型黑洞
形态学梯度:就是膨胀图与腐蚀图之差,用于保留物体的边缘轮廓。
顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。