o2co2 发表于 2012-8-7 16:20:13

[OpenCV2.4]图像二值化处理

我的博客:http://zwmin.com
我的博客上排版会好些。


处理像素值的阈值,图像进行二值化处理。阈值处理方法如下:

[*]THRESH_BINARY:二进制阈值化.解释:在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。
[*]THRESH_BINARY_INV:反二进制阈值化.解释:该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。
[*]THRESH_TRUNC:截断阈值化.解释:同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。
[*]THRESH_TOZERO:阈值化为0.解释:先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。
[*]THRESH_TOZERO_INV:反阈值化为0.解释:原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。
此外,特殊值THRESH_OTSU可以和上述几种情况相结合。在这种情况下,函数确定最佳阀值,使用最大类间方差(OTSU)算法,并使用它,而不是指定的阀值。该函数返回返回计算出来的最佳阀值,目前只支持8位图像。此外,adaptiveThreshold是自适应阀值函数,既阀值根据适应的规则自适应确定输入。阀值的测定方法有以下几种:
[*]ADAPTIVE_THRESH_MEAN_C:阀值T(x,y) 是,(x,y)的附近 blockSize x blockSize 的平均的值减去C的值。
[*]ADAPTIVE_THRESH_GAUSSIAN_C:阀值T(x,y) 是,(x,y) 的附近 blockSize x blockSize 的(使用高斯分布)加重平均的值减去C的值.从blockSize确定这高斯分布的标准偏差。
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int
main(int argc, char *argv[])
{
cv::Mat gray_img = cv::imread(“../../image/lenna.png”, 0);
if(gray_img.empty()) return -1;
// 固定的阀值处理图像
cv::Mat bin_img, bininv_img, trunc_img, tozero_img, tozeroinv_img;
// 输入画像,输出画像,阀值,maxVal,处理阀值的方法
cv::threshold(gray_img, bin_img, 0, 255, cv::THRESH_BINARY|cv::THRESH_OTSU);
cv::threshold(gray_img, bininv_img, 0, 255, cv::THRESH_BINARY_INV|cv::THRESH_OTSU);
cv::threshold(gray_img, trunc_img, 0, 255, cv::THRESH_TRUNC|cv::THRESH_OTSU);
cv::threshold(gray_img, tozero_img, 0, 255, cv::THRESH_TOZERO|cv::THRESH_OTSU);
cv::threshold(gray_img, tozeroinv_img, 0, 255, cv::THRESH_TOZERO_INV|cv::THRESH_OTSU);
// 自适应阀值处理
cv::Mat adaptive_img;
// 输入画像,输出画像,maxVal,阀值決定方法,阀值处理手法,blockSize,C
cv::adaptiveThreshold(gray_img, adaptive_img, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 7, 8);
// 结果画像显示
cv::namedWindow(“Binary”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow(“Binary Inv”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow(“Trunc”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow(“ToZero”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow(“ToZero Inv”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow(“Adaptive”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow(“Binary”, bin_img);
cv::imshow(“Binary Inv”, bininv_img);
cv::imshow(“Trunc”, trunc_img);
cv::imshow(“ToZero”, tozero_img);
cv::imshow(“ToZero Inv”, tozeroinv_img);
cv::imshow(“Adaptive”, adaptive_img);
cv::waitKey(0);
}
输入画像:结果图像:   

迷你强 发表于 2012-8-7 18:20:37

:funk:好牛啊。。。。。。感觉好强大,,,,

kuanglig1995 发表于 2016-6-7 10:54:02

给楼主点赞
页: [1]
查看完整版本: [OpenCV2.4]图像二值化处理