《opencv学习》 之 二值化

主要讲解OTSU算法实现图像二值化:

        1.统计灰度级图像中每个像素值的个数。

    2.计算第一步个数占整个图像的比例。

    3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就是分别计算背景和前景下第一步和第二步的              和)。

    4.比较第三步前景和背景之间方差,找到最大的一个确定为选定的阈值。

 OTSU源码: 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 #include <windows.h>
 4
 5 using namespace cv;
 6 using namespace std;
 7
 8 int OTSU(Mat& src);
 9 int main(int argc, char**argv)
10 {
11     Mat input_image;
12     input_image = imread("1.jpg");
13
14     if (input_image.data == NULL) {
15         return -1; cout << "can‘t open image.../";
16     }
17     cvtColor(input_image, input_image, CV_BGR2GRAY);
18     const int thre_num = OTSU(input_image);
19     const int height = input_image.rows;
20     const int width = input_image.cols;
21     for (size_t i = 0; i < height; i++)
22     {
23         for (size_t j = 0; j < width; j++)
24         {
25             input_image.at<uchar>(i, j) = input_image.at<uchar>(i, j) >= thre_num ? 0 : 255;
26         }
27     }
28     imshow("input_image2", input_image);
29     waitKey(0);
30     return 0;
31 }
32
33 int OTSU(Mat& src)
34 {
35     const int height = src.rows;
36     const int width = src.cols;
37     int nCountPix[256] = { 0 };//数量
38     int nProPix[256] = { 0 };//概率
39                              //------------统计像素点个数------------//
40     for (size_t i = 0; i < height; i++)
41     {
42         for (size_t j = 0; j < width; j++)
43         {
44             nCountPix[src.at<uchar>(i, j)]++;
45         }
46     }
47     //-------统计每个像素个数占得比例------//
48     for (size_t i = 0; i < 256; i++)
49     {
50         nProPix[i] = nCountPix[i] / (height*width);
51     }
52     double var_max = 100;//设置一个参数,作为比较结果
53     int       threashold = 0;
54     for (size_t i = 0; i < height; i++)
55     {
56         //----数量count、概率probility、平均概率average、方差variance----//
57         double c0 = 0, c1 = 0, p0 = 0, p1 = 0, a0 = 0, a1 = 0, var = 0;
58         for (size_t j = 0; j < width; j++)
59         {
60             //----前景和背景的计算
61             if (i < j)//背景
62             {
63                 c0 += nCountPix[j];//总数量
64                 p0 += nCountPix[j] * nProPix[j];//总概率
65             }
66             else//前景
67             {
68                 c1 += nCountPix[j];//总数量
69                 p1 += nCountPix[j] * nProPix[j];//总概率
70             }
71         }
72         a0 = p0 / c0;
73         a1 = p1 / c1;
74         var = static_cast<double>(c0*c1*pow((a0 - a1), 0));
75
76         if (var > var_max)
77         {
78             var_max = var;
79             threashold = i;
80         }
81     }
82     return threashold;
83 }

时间: 2024-10-05 05:21:48

《opencv学习》 之 二值化的相关文章

OpenCV图像的二值化

图像的二值化: 与边缘检测相比,轮廓检测有时能更好的反映图像的内容.而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果.在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓. 下面就介绍OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测函数原型:void cvThreshold( 

以代码为基础的opencv-python学习 图像二值化

import cv2import numpy as np #此方法可以将彩色图根据一定的阈值转换为黑白图.其中阈值用于划分图片的黑白(局部方法)def threshold_deom(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 127,255,cv2.THRESH_BINARY)#可将图像中的颜色转为0或1,即黑和白.其中127表示阈值,大于127的是白色,小于12

【OPENCV】图像的预处理(灰度图、二值化、字符矫正(旋转))

1.首先加载原始图片: 2.cvCvtColor(img, source, CV_BGR2GRAY);转化成灰度图像: 3.cvThreshold(source,source_gray,100,255,CV_THRESH_BINARY );进行二值化处理. 由于原始的图片会有一定的角度,需要进行旋转,而旋转的话可以使用OPENCV提供的函数实现,本文中采用的是自己编写的,即通过旋转360,并记录旋转某个角度的时候使得在x轴方向的投影最大化. 如图,经过处理的图片效果如下所示: 完整的工程已经上传

opencv 删除二值化图像中面积较小的连通域

对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg.DoModal()==IDOK) { CvMemStorage* storage = cvCreateMemStorage(0); IplImage* img_src= cvLoadImage(

OpenCV中对图像进行二值化的关键函数——cvThreshold()。

函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); 函数说明: 第一个参数表示输入图像,必须为单通道灰度图. 第二个参数表示输出的边缘图像,为单通道黑白图. 第三个参数表示阈值 第四个参数表示最大值. 第五个参数表示运算方法. 在OpenCV的imgproc\types_c.h中

OpenCV图像的全局阈值二值化函数(OTSU)

cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最佳阈值算法.该方法在类间方差最大的情况下是最佳的,就图像的灰度值而言,OTSU给出最好的类间分离的阈值. OpenCV阈值分割的几种方法(types_c.h中的定义): /* Threshold types */ enum { CV_THRESH_BINARY =0, /* value = valu

[iOS OpenCV的使用,灰度和二值化]

看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使用: 步骤: 1.从官网下载iOS版本的Opencv2.framework. 2.拖进工程,选择copy items if needed 3.进入building settings,设置Framework SearchPath: 设置成$(PROJECT_DIR)/Newtest,这个Newtest

【opencv】统计图像二值化后白色像素点个数

应用:图像特征提取 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/core/core.hpp" #include <opencv\ml.h> #include <iostream> #include "cv.h" #include "highgui.

Ubuntu 14.04 下使用 OpenCV 图片二值化处理

参考: OpenCV - Ubuntu 14.04 64 bit 图片二值化工具 Ubuntu 14.04 下使用 OpenCV 图片二值化处理 TBD. 原文地址:https://www.cnblogs.com/qq952693358/p/8996719.html