图像的二值化:将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
API函数
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
含义:
src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(一般取灰度图处理)
dst:输出图像
thresh:阈值
maxval:dst图像中最大值
type:阈值类型,
源程序
#include “stdafx.h”
//本节讲述 图像处理之 图像金字塔-上采样和下采样;
#include <opencv2/opencv.hpp>
#include
#include <math.h>
using namespace std;
using namespace cv;
Mat src, dst, asd,gray_src;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4; //通过滑动切换阈值类型,5种
//const char*
void shreshold_demo(int,void*);
const char*output_title = “阈值操作”;
int main(int argc, char**argv)
{
src = imread(“C:/Users/Rubison.DELL/Desktop\杂物/壁纸/小白2.jpg”); //存放自己图像的路径
if (!src.data)
{
printf(“could not load image…\r\n”);
return -1;
}
char input_title[] = "原图";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title,src);
createTrackbar("Threshold value", output_title, &threshold_value, threshold_max, shreshold_demo);
createTrackbar("type value", output_title, &type_value, type_max, shreshold_demo);
shreshold_demo(0,0);
waitKey(0);
destroyAllWindows();
return 0;
}
void shreshold_demo(int, void*)
{
cvtColor(src, gray_src, CV_BGR2GRAY);
threshold(gray_src, dst, threshold_value, threshold_max, type_value); //注意 !这里type_value本应该是阈值类型,
imshow(output_title, dst); //由于它的类型对应0到4,既被赋值,可以通过改变变量type_value的值从而改变阈值类型
}
程序验证
补充 (该部分均为转载,出处位于首段)
自适应阈值化(THRESH_OTSU)和三角形算法(THRESH_TRIANGLE)算法
自适应阈值:转载出处
OTSU算法(大津法)是一种图像灰度自适应的阈值分割算法。大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分。背景和前景的分界值就是我们要求出的阈值。遍历不同的阈值,计算不同阈值下对应的背景和前景之间的类内方差,当类内方差取得极大值时,此时对应的阈值就是OTSU算法(大津法)所求的阈值。
Otsu实现思路
- 计算0~255各灰阶对应的像素个数,保存至一个数组中,该数组下标是灰度值,保存内容是当前灰度值对应像素数
- 计算背景图像的平均灰度、背景图像像素数所占比例
- 计算前景图像的平均灰度、前景图像像素数所占比例
- 遍历0~255各灰阶,计算并寻找类间方差极大值
三角法图像二值化:三角法阈值分割–转载