opencv二值化(opencv二值化图像)
本篇文章给大家谈谈opencv二值化,以及opencv二值化图像对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
C++ opencv 图片二值化最佳阈值确定(大津法,OTSU算法)
//opencv
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/顷汪imgproc.hpp"
/******************************************************************************************
Function: OtsuThreshold
Description: 图片二值化最佳阈值确滚乎哗定(大津法,OTSU算法)
Input: src:原图片
Return: 阈值
******************************************************************************************/
int OtsuThreshold(IplImage* src)
{
int threshold;
try
{
int height = src-height;
int width = src-width;
//histogram 大行
float histogram[256] = { 0 };
for (int i = 0; i height; i++) {
unsigned char* p = (unsigned char*)src-imageData + src-widthStep*i;
for (int j = 0; j width; j++) {
histogram[*p++]++;
}
}
//normalize histogram
int size = height*width;
for (int i = 0; i 256; i++) {
histogram[i] = histogram[i] / size;
}
//average pixel value
float avgValue = 0;
for (int i = 0; i 256; i++) {
avgValue += i*histogram[i];
}
float maxVariance = 0;
float w = 0, u = 0;
for (int i = 0; i 256; i++) {
w += histogram[i];
u += i*histogram[i];
float t = avgValue*w - u;
float variance = t*t / (w*(1 - w));
if (variance maxVariance) {
maxVariance = variance;
threshold = i;
}
}
}
catch (cv::Exception e)
{
}
return threshold;
}
[img]图像二值化的OpenCV
OpenCV中有两个函数可以实现图片的二值化:
(1)cvThreshold( dst, dst,230 , 255, CV_THRESH_BINARY_INV);
(2)cvAdaptiveThreshold( dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 9, -10);
方法(1)是手动指定一个阈值,以此阈值御烂缓来进行二值化处理。其中的第四个参数决定了该方法的结果:
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)threshold 0, otherwise.
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)threshold; dst(x,y) = max_value, otherwise.
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, if src(x,y)threshold; dst(x,y) = src(x,y), otherwise.
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if (x,y)threshold ; dst(x,y) = 0, otherwise.
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, if src(x,y)threshold ; dst(x,y) = src(x,y), otherwise.
值得一说的是threshold_type可以使用CV_THRESH_OTSU类型,这样该函数镇模就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起 作用。比如:cvThreshold( dst, dst,300 , 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);这种方法对于灰度直方图呈现二峰特征的图片处理历棚起来效果很好。
方法(2)是一个自适应阈值二值化方法,通过设定最后两个参数来调整效果。
利用 opencv实现图像自适应二值化 --python
阈值化:给定一个数组和一个与之,然后根据数组中的每个元素的值,是高于还是低于阈值而进行一些操作。如果像素值大于阈值,则分配给它一个值(如白色的),否则它被分配给另一个值(如黑色)。
此为固定阈值的事例。具体效果如下:
函数中四个参数分别是原图像、阈值、最大值、阈值类型
阈值类型一般分为五种:
cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0
cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值
cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变
cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0
cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变
自适芦团应阈值缓中是根据图像上的每一个小区域计算与其对应的阈值,因此在同一幅图像上采用的是不同的阈值,从而能使我们在亮度 不同的情况下得到更好的结果。
th2为算术平均扰哗山法的自适应二值化
th3为高斯加权均值法自适应二值化
结果如下:
关于opencv二值化和opencv二值化图像的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。