cpencv分割图像

1  基于阈值

1.1  原理

  灰度阈值化,是最简单且速度最快的图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理)。

  假设输入图像为 f,输出图像为 g,则阈值化公式如下:

  g(i,j)={10 f(i, j) ≥ T f(i, j) < T

  也即,遍历图像中的所有像素,当像素值 f (i, j) ≥ T 时,分割后的图像元素 g (i, j) 是物体像素,否则为背景像素。

1.2  适用范围

  当各个物体之间不接触,且物体灰度和背景灰度之间差别比较明显时,灰度阈值化是非常合适的分割方法

1.3  cv::threshold 函数 

  OpenCV 中的阈值化函数为 threshold,其使用如下所示:


double cv::threshold (     
    InputArray  src,   // 输入图像 (单通道,8位或32位浮点型)   
    OutputArray  dst,  // 输出图像 (大小和类型,都同输入) 
    double    thresh, // 阈值
    double    maxval, // 最大灰度值(使用 THRESH_BINARY 和 THRESH_BINARY_INV类型时) 
    int      type   // 阈值化类型(THRESH_BINARY, THRESH_BINARY_INV; THRESH_TRUNC; THRESH_TOZERO, THRESH_TOZERO_INV) 
)

  1) THRESH_BINARY

dst(x,y)={maxval0if src(x, y) > threshotherwise

  2) THRESH_TRUNC

dst(x,y)={thresholdsrc(x,y)if src(x, y) > threshotherwise

  3) THRESH_TOZERO 

 dst(x,y)={src(x,y)0if src(x, y) > threshotherwise

1.4  示例

  下面是阈值化类型和阈值可选的代码示例,摘自 OpenCV 例程,略作修改


#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;

int threshold_value = 0;
int threshold_type = 3;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;

Mat src, src_gray, dst;
const char* window_name = "Threshold Demo";

const char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";
const char* trackbar_value = "Value";

void Threshold_Demo(int, void*);

int main( int, char** argv )
{
  // 读图
  src = imread("Musikhaus.jpg",IMREAD_COLOR);
  if( src.empty() )
      return -1;

  // 转化为灰度图
  cvtColor( src, src_gray, COLOR_BGR2GRAY );
  // 显示窗口
  namedWindow( window_name, WINDOW_AUTOSIZE );
  // 滑动条 - 阈值化类型
  createTrackbar( trackbar_type, window_name, &threshold_type,max_type,Threshold_Demo);
  // 滑动条 - 阈值
  createTrackbar( trackbar_value,window_name, &threshold_value,max_value,Threshold_Demo);

  Threshold_Demo(0, 0);

  waitKey(0);
}

void Threshold_Demo(int, void*)
{
    /* 0: Binary
    1: Binary Inverted
    2: Threshold Truncated
    3: Threshold to Zero
    4: Threshold to Zero Inverted
    */
    threshold(src_gray, dst, threshold_value, max_BINARY_value, threshold_type);
    imshow(window_name, dst);
}

猜你喜欢

转载自blog.csdn.net/max2009verygood/article/details/79175772