opencv学习笔记之二值化
1.什么是二值化 二值化,从名词意义上可以看出来,是将一共物体转化成两个值。二值即:0或255.即一个白色一个黑色。即一个图片经过二值化之后会显示成白色和黑色的形式。 2.什么时候需要二值化 我是最近有一个边缘检测的东西,才回头看二值化的问题因为当一个图片有很多的元素和噪声参杂,我们直接调用canny边缘检测是不行的,无论你怎么调阈值都不能完整的将边缘提取出来。二值化此时就是将不需要的 元素除去。 3.二值化 (1)全局二值化: 对于一个完整的图像,我们对其的全局进行二值化,范围整个图片,对其设置一个阈值,将大于阈值的都为黑,不大于阈值的则为白色 (2)局部二值化方法: 以像素的邻域的信息为基础来计算每一个像素的阈值。其中一些方法还会计算整个图像中的一个阈值面。如果图像中的一个像素(x,y)的灰度级高于在(x,y)点的阈值面的计算值,那么把像素(x,y)标记为背景,否则为前景字符。 4.实现二值化
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
Mat src,src_gray;
Mat dst, detected_edges;
Mat thresholds;
int edgeThresh = 1;
int lowThreshold;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
int nThreshold = 0;
const char* window_name = "Edge Map";
const char* newimage ="newimage";
const char* newimages ="newimages";
static void CannyThreshold(int, void*)
{
blur( src_gray, detected_edges, Size(3,3) );
namedWindow(newimages, WINDOW_AUTOSIZE );
imshow(newimages, detected_edges);
Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
dst = Scalar::all(0);
src.copyTo( dst, detected_edges);
imshow( window_name, dst );
}
void on_trackbar(int ,void*)
{
blur( src_gray, detected_edges, Size(3,3) );
thresholds.creat(detected_edges.size(),detected_edges.type());
threshold(detected_edges,thresholds,nThreshold,255,THRESH_BINARY);
namedWindow(thresholdsimge, WINDOW_AUTOSIZE );
imshow(thresholdsimge, thresholds);
}
int main( int, char** argv )
{
src = imread( argv[1], IMREAD_COLOR );
if( src.empty() )
{ return -1; }
dst.create( src.size(), src.type() );
cvtColor( src, src_gray, COLOR_BGR2GRAY );
namedWindow(newimage, WINDOW_AUTOSIZE );
imshow(newimage, src_gray );
namedWindow( window_name, WINDOW_AUTOSIZE );
createTrackbar("二值图阈值", "二值图", &nThreshold, 254, on_trackbar);
on_trackbar(1, 0);
createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
CannyThreshold(0, 0);
waitKey(0);
return 0;
}
上述代码是canny和二值化一起使用的代码
|