国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于opencv的c++圖像處理(圖像二值化)

這篇具有很好參考價值的文章主要介紹了基于opencv的c++圖像處理(圖像二值化)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

基于opencv的c++接口,實現(xiàn)常用的圖像二值化方法,包括了最大類間方差法(OTSU)、固定化閾值以及自適應(yīng)閾值。

相關(guān)的opencv接口解析

CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
                               double thresh, double maxval, int type );

該函數(shù)將固定級別的閾值應(yīng)用于多通道陣列。該函數(shù)通常用于從灰度圖像中獲取雙層(二進制)圖像(#compare 也可用于此目的)或用于去除噪聲,即過濾掉值過小或過大的像素.該函數(shù)支持幾種類型的閾值。它們由類型參數(shù)確定。
此外,特殊值#THRESH_OTSU 或#THRESH_TRIANGLE 可以與上述值之一組合。在這些情況下,該函數(shù)使用 Otsu 或 Triangle 算法確定最佳閾值,并使用它代替指定的閾值。

@param src 輸入數(shù)組(多通道、8 位或 32 位浮點)。
@param dst 與 src 具有相同大小和類型以及相同通道數(shù)的輸出數(shù)組。
@param thresh 閾值。
@param maxval 與 #THRESH_BINARY 和 #THRESH_BINARY_INV 閾值類型一起使用的最大值。
@param type 閾值類型(請參閱#ThresholdTypes)。
@return 如果使用 Otsu 或 Triangle 方法,則計算閾值。

enum ThresholdTypes {
    THRESH_BINARY     = 0, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{maxval}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f]
    THRESH_BINARY_INV = 1, //!< \f[\texttt{dst} (x,y) =  \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxval}}{otherwise}\f]
    THRESH_TRUNC      = 2, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f]
    THRESH_TOZERO     = 3, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f]
    THRESH_TOZERO_INV = 4, //!< \f[\texttt{dst} (x,y) =  \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f]
    THRESH_MASK       = 7,
    THRESH_OTSU       = 8, //!< flag, use Otsu algorithm to choose the optimal threshold value
    THRESH_TRIANGLE   = 16 //!< flag, use Triangle algorithm to choose the optimal threshold value
};
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

對數(shù)組應(yīng)用自適應(yīng)閾值。該函數(shù)根據(jù)公式將灰度圖像轉(zhuǎn)換為二值圖像:

  • THRESH_BINARY
    \f[dst(x,y) = \fork{\texttt{maxValue}}{如果 (src(x,y) > T(x,y))}{0}{否則}\f]
  • THRESH_BINARY_INV
    \f[dst(x,y) = \fork{0}{如果 (src(x,y) > T(x,y))}{\texttt{maxValue}}{否則}\f]
    其中 \fKaTeX parse error: Undefined control sequence: \f at position 7: T(x,y)\?f? 是為每個像素單獨計算的閾值(請參閱 AdaptiveMethod 參數(shù))。
    該函數(shù)可以就地處理圖像。
    @param src 源 8 位單通道圖像。
    @param dst 與 src 大小和類型相同的目標圖像。
    @param maxValue 分配給滿足條件的像素的非零值
    @param AdaptiveMethod 要使用的自適應(yīng)閾值算法,請參閱#AdaptiveThresholdTypes。
    #BORDER_REPLICATE | #BORDER_ISOLATED 用于處理邊界。
    @param thresholdType 閾值類型,必須是#THRESH_BINARY 或#THRESH_BINARY_INV,請參閱#ThresholdTypes。
    @param blockSize 用于計算像素閾值的像素鄰域的大小:3、5、7 等。
    @param C 從平均值或加權(quán)平均值中減去常數(shù)。通常,它是正數(shù),但也可能為零或負數(shù)。
enum AdaptiveThresholdTypes {
    /** the threshold value \f$T(x,y)\f$ is a mean of the \f$\texttt{blockSize} \times
    \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ minus C */
    ADAPTIVE_THRESH_MEAN_C     = 0,
    /** the threshold value \f$T(x, y)\f$ is a weighted sum (cross-correlation with a Gaussian
    window) of the \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$
    minus C . The default sigma (standard deviation) is used for the specified blockSize . See
    #getGaussianKernel*/
    ADAPTIVE_THRESH_GAUSSIAN_C = 1
};

示例代碼

binarizate.h

#pragma once
#include <iostream>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>

using namespace std;
using namespace cv;
#define PROCESS_IMG_SUCESS 0
#define PROCESS_IMG_FAIL 1

namespace ImgEnhance
{
	//二值化
	class Binarizate
	{

	public:
		Binarizate() { cout << "Binarizate is being created" << endl; } // 這是構(gòu)造函數(shù)聲明
		~Binarizate() { cout << "Binarizate is being deleted" << endl; } // 這是析構(gòu)函數(shù)聲明

		int OTSU(cv::Mat srcImage);// 大律法函數(shù)實現(xiàn)
		int OtsuBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int maxVal, int threshType);//大律法二值化
		int FixedBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int thresh, int maxVal, int threshType);//固定化閾值
		int AdaptiveBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int maxVal, int adaptiveMethod, int thresholdType, int blockSize, int constValue);//自適應(yīng)閾值化

	};
}

binarizate.cpp

#include "binarizate.h"

int ImgEnhance::Binarizate::OTSU(cv::Mat srcImage)
{
	int nCols = srcImage.cols;
	int nRows = srcImage.rows;
	int threshold = 0;
	// 初始化統(tǒng)計參數(shù)
	int nSumPix[256];
	float nProDis[256];
	for (int i = 0; i < 256; i++)
	{
		nSumPix[i] = 0;
		nProDis[i] = 0;
	}
	// 統(tǒng)計灰度級中每個像素在整幅圖像中的個數(shù) 
	for (int i = 0; i < nCols; i++)
	{
		for (int j = 0; j < nRows; j++)
		{
			nSumPix[(int)srcImage.at<uchar>(i, j)]++;
		}
	}
	// 計算每個灰度級占圖像中的概率分布
	for (int i = 0; i < 256; i++)
	{
		nProDis[i] = (float)nSumPix[i] / (nCols * nRows);
	}
	// 遍歷灰度級[0,255],計算出最大類間方差下的閾值  
	float w0, w1, u0_temp, u1_temp, u0, u1, delta_temp;
	double delta_max = 0.0;
	for (int i = 0; i < 256; i++)
	{
		// 初始化相關(guān)參數(shù)
		w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;
		for (int j = 0; j < 256; j++)
		{
			//背景部分 
			if (j <= i)
			{
				// 當前i為分割閾值,第一類總的概率  
				w0 += nProDis[j];
				u0_temp += j * nProDis[j];
			}
			//前景部分   
			else
			{
				// 當前i為分割閾值,第一類總的概率
				w1 += nProDis[j];
				u1_temp += j * nProDis[j];
			}
		}
		// 分別計算各類的平均灰度 
		u0 = u0_temp / w0;
		u1 = u1_temp / w1;
		delta_temp = (float)(w0 *w1* pow((u0 - u1), 2));
		// 依次找到最大類間方差下的閾值    
		if (delta_temp > delta_max)
		{
			delta_max = delta_temp;
			threshold = i;
		}
	}
	return threshold;
}

int ImgEnhance::Binarizate::OtsuBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int maxVal, int threshType)
{
	if (!srcImage.data || srcImage.channels() != 1)
	{
		return 1;
	}
	// 初始化閾值參數(shù)
	int thresh = OTSU(srcImage);
	// 初始化閾值化處理的類型 
	/* 0: 二進制閾值 1: 反二進制閾值 2: 截斷閾值
	3: 0閾值   4: 反0閾值*/
	//int threshType = 0;
	// 預(yù)設(shè)最大值
	//const int maxVal = 255;
	// 固定閾值化操作
	cv::threshold(srcImage, dstImage, thresh,
		maxVal, threshType);
	return 0;

}

int ImgEnhance::Binarizate::FixedBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int thresh, int maxVal, int threshType)
{
	if (!srcImage.data || srcImage.channels() != 1)
	{
		return 1;
	}
	// 初始化閾值參數(shù)
	//int thresh = 130;
	// 初始化閾值化處理的類型 
	/* 0: 二進制閾值 1: 反二進制閾值 2: 截斷閾值
	3: 0閾值   4: 反0閾值 8:大均法*/
	//int threshType = 0;
	// 預(yù)設(shè)最大值
	//const int maxVal = 255;
	// 固定閾值化操作
	cv::threshold(srcImage, dstImage, thresh,
		maxVal, threshType);
	return 0;
}

int ImgEnhance::Binarizate::AdaptiveBinarizate(cv::Mat srcImage, cv::Mat &dstImage, int maxVal, int adaptiveMethod, int thresholdType, int blockSize, int constValue)
{
	if (!srcImage.data || srcImage.channels() != 1)
	{
		return 1;
	}
	// 初始化自適應(yīng)閾值參數(shù)
	//int blockSize = 5;
	//int constValue = 10;
	//const int maxVal = 255;
	/* 自適應(yīng)閾值算法
	0:ADAPTIVE_THRESH_MEAN_C
	1: ADAPTIVE_THRESH_GAUSSIAN_C
	閾值類型
	0: THRESH_BINARY
	1: THRESH_BINARY_INV */
	//int adaptiveMethod = 0;
	//int thresholdType = 1;
	// 圖像自適應(yīng)閾值操作
	cv::adaptiveThreshold(srcImage, dstImage, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);
	return 0;
}

test.cpp

#include"binarizate.h"

ImgEnhance::Binarizate ImgB;//二值化

int main()
{
	// 讀取源圖像及判斷
	cv::Mat srcImage = cv::imread("flower.jpg");
	if (!srcImage.data)
	{
		return 1;
	}
	/*cv::namedWindow("原始圖", 0);
	cv::imshow("原始圖", srcImage);*/
	// 轉(zhuǎn)化為灰度圖像
	cv::Mat srcGray;
	if (srcImage.channels() == 3)
	{
		cv::cvtColor(srcImage, srcGray, COLOR_RGB2GRAY);
	}
	else
	{
		srcGray = srcImage.clone();
	}
	cv::namedWindow("灰度圖", 0);
	cv::imshow("灰度圖", srcGray);


	//最大類間方差二值化(OTSU)
	Mat otsuImage;
	const int maxVal = 255;
	int threshType = 0;
	// 初始化閾值化處理的類型 
	/* 0: 二進制閾值 1: 反二進制閾值 2: 截斷閾值
	3: 0閾值   4: 反0閾值*/
	ImgB.OtsuBinarizate(srcGray, otsuImage, maxVal, threshType);
	cv::namedWindow("otsu二值化圖", 0);
	cv::imshow("otsu二值化圖", otsuImage);

	//固定化閾值
	Mat fixedImage;
	int thresh = 100;
	int threshType2 = 0;
	ImgB.FixedBinarizate(srcGray, fixedImage, thresh, maxVal, threshType2);//固定化閾值
	cv::namedWindow("固定閾值二值化圖", 0);
	cv::imshow("固定閾值二值化圖", fixedImage);

	//自適應(yīng)閾值化
	// 初始化自適應(yīng)閾值參數(shù)
	Mat adaptiveImage;
	int blockSize = 5;
	int constValue = 10;
	//const int maxVal = 255;
	/* 自適應(yīng)閾值算法
	0:ADAPTIVE_THRESH_MEAN_C
	1: ADAPTIVE_THRESH_GAUSSIAN_C
	閾值類型
	0: THRESH_BINARY
	1: THRESH_BINARY_INV */
	int adaptiveMethod = ADAPTIVE_THRESH_GAUSSIAN_C;
	int thresholdType = 0;
	ImgB.AdaptiveBinarizate(srcGray, adaptiveImage, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);
	cv::namedWindow("自適應(yīng)閾值-高斯二值化圖", 0);
	cv::imshow("自適應(yīng)閾值-高斯二值化圖", adaptiveImage);

	cv::waitKey(0);

	return 0;

}

結(jié)果展示

基于opencv的c++圖像處理(圖像二值化)文章來源地址http://www.zghlxwxcb.cn/news/detail-466576.html

到了這里,關(guān)于基于opencv的c++圖像處理(圖像二值化)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C#使用OpenCv(OpenCVSharp)圖像局部二值化處理實例

    ? 本文實例演示C#語言中如何使用OpenCv(OpenCVSharp)對圖像進行局部二值化處理。 目錄 圖像二值化原理 局部二值化 自適應(yīng)閾值 實例 效果

    2024年02月13日
    瀏覽(25)
  • OpenCV-Python學(xué)習(xí)(10)—— OpenCV 圖像二值化處理(cv.threshold)

    OpenCV-Python學(xué)習(xí)(10)—— OpenCV 圖像二值化處理(cv.threshold)

    1. 學(xué)習(xí)目標 理解圖像的分類,不同類型的圖像的區(qū)別; 對圖像進行二值化處理,對【 cv.threshold 】函數(shù)的理解。 2. 圖像分類 2.1 不同類型圖像說明 按照顏色對圖像進行分類,可以分為二值圖像、灰度圖像和彩色圖像。 二值圖像: 只有黑色和白色兩種顏色的圖像。 每個像素

    2024年02月03日
    瀏覽(103)
  • [2] 圖像處理之----二值化處理

    [2] 圖像處理之----二值化處理

    簡單閾值是選取一個全局閾值,然后把整幅圖像分成非黑即白的二值圖像,灰度值大于閾值就賦為255反之為0。 ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINAR) 返回值一: 閾值,(Otsu‘s二值化會用到) 返回值二: 處理以后的圖像 參數(shù)一: 初始圖像 參數(shù)二:我們自己設(shè)定的閾

    2024年02月05日
    瀏覽(23)
  • MATLAB 圖像處理 (二值化,image圖片黑白處理)

    Q: MATLAB如何將圖片進行 二值化 ,并將 二值化后圖片 中的 黑色變成白色 , 原本的白色保持不變,黑白之間的黑色輪廓保持不變。 A: 使用 MATLAB 中的 imbinarize 函數(shù) 進行圖片二值化。將指定閾值以下的像素值設(shè)為 0,其他像素值設(shè)為 1。 然后可以使用邏輯取反運算符 ~ (波浪線

    2023年04月08日
    瀏覽(19)
  • FPGA|數(shù)字圖像處理實現(xiàn)口罩識別——二值化

    FPGA|數(shù)字圖像處理實現(xiàn)口罩識別——二值化

    【寫在前面】剛?cè)腴T小菜鳥,記錄一下口罩識別學(xué)習(xí)過程。參考文件和網(wǎng)址會在文末注明。有錯誤歡迎指出,也歡迎進行補充~ 原理圖如下,二值化對應(yīng)為紅框里的部分 使用的二值化方法是 手動指定一個 閾值 ,通過閾值來進行二值化處理 。(還有一種方法是一個自適應(yīng)閾值

    2023年04月11日
    瀏覽(18)
  • python圖像處理實戰(zhàn)(二)—二值化圖像與線性變換

    python圖像處理實戰(zhàn)(二)—二值化圖像與線性變換

    ??寫在前面?? ??個人主頁:https://blog.csdn.net/m0_52051577?type=blog? ??歡迎各位大佬支持點贊收藏,三連必回!! ??本人新開系列專欄—python圖像處理 ?愿每一個驟雨初晴之時,所有的蜻蜓振翅和雨后驚雷,都歸你。 前言 ????????首先引入以下灰度變換的概念。 ?????

    2024年02月07日
    瀏覽(26)
  • 二、FPGA實時圖像處理(灰度轉(zhuǎn)換、高斯濾波、二值化和邊緣檢測)

    二、FPGA實時圖像處理(灰度轉(zhuǎn)換、高斯濾波、二值化和邊緣檢測)

    基于圖像實時采集系統(tǒng)實現(xiàn)圖像處理 算法:采用精度為7的心理學(xué)公式:Gray = R 0.299 + G 0.587 + B 0.114, Gray = R 38 + G 75 + B 15 7 采用sobel算子進行邊緣檢測。 可以通過參數(shù)定義修改二值化和邊緣檢測閾值,以及控制是否進行圖像處理和圖像處理類型選擇。 高斯濾波效果不明顯不做演

    2024年02月11日
    瀏覽(28)
  • 圖像二值化處理(全局閾值 自適應(yīng)閾值 手動閾值操作以及直方圖畫法)

    圖像二值化處理(全局閾值 自適應(yīng)閾值 手動閾值操作以及直方圖畫法)

    圖像二值化就是把讓圖像的像素點只有0和1(只有黑白兩各種顏色,黑是背景,白是前景),關(guān)鍵點是尋找一個閾值T,使圖像中小于閾值T的像素點變?yōu)?,大于T的像素點變?yōu)?55。下面介紹的就是尋找一個圖像的閾值T的方法。(主要根據(jù)直方圖) retval:返回的閾值(double類型)

    2024年02月08日
    瀏覽(30)
  • 使用OpenCV C++進行圖像二值化操作

    使用OpenCV C++進行圖像二值化操作

    threshold()將固定閾值應(yīng)用于多通道圖像陣列,通常用于從灰度圖像中獲得二值圖像或用于去除噪聲,即濾除值過小或過大的像素。該函數(shù)支持幾種類型的閾值設(shè)置,它們由類型參數(shù)決定。 src:輸入數(shù)組(多通道,8位或32位浮點數(shù)) dst:輸出數(shù)組(與src的尺寸、類型、通道數(shù)相

    2024年02月03日
    瀏覽(25)
  • opencv-圖像處理基礎(chǔ)-二值圖像

    opencv-圖像處理基礎(chǔ)-二值圖像

    1.二值圖像 二值圖像是指僅僅包含黑色和白色兩種顏色的圖像。 在計算機中,通過一個柵格狀排列的數(shù)據(jù)集(矩陣)來表示和處理圖像。例如,圖 2-1 是 一個字母 A 的圖像,計算機在處理該圖像時,會首先將其劃分為一個個的小方塊,每一個小方 塊就是一個獨立的處理單位

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包