一、閾值化操作
1、閾值滑動條:
createTrackbar使用方法及步驟
第一個引數:conststring& trackbarname,表示軌跡條的名字
第二個引數:conststring& winname,表示軌跡條依托視窗的名稱
Threshold_Demo:是回呼函式,實時回傳,
2、閾值函式:
threshold(gray_dst, dst2, threshold_value, threshold_max, THRESH_BINARY);
gray_dst:原影像
threshold_value:閾值
threshold_max:最大值,一般為255
type:
cv2.THRESH_BINARY:二值化,超過閾值的像素設定為max,不超過的設定為0
cv2.THRESH_BINARY_INV:反二值化,不超過閾值的設定為max,超過的設定為0
cv2.THRESH_TRUNC:截斷,超過閾值的設定為threshold
cv2.THRESH_TOZERO:低于閾值的設定為0
cv2.THRESH_TOZERO_INV:低于閾值的設定為max
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
Mat src, dst, dst2, gray_dst;
int threshold_value = 127;
int threshold_max = 255;
const char* output = "binary image";
void Threshold_Demo(int, void*);
int main()
{
src = imread("D:/PT/circle_stone.jpg");
if (!src.data) {
printf("could not load the image...\n");
return -1;
}
double scale = 0.5;
Size dsize = Size(src.cols * scale, src.rows * scale);
resize(src, dst, dsize);
//為影像創建邊框
//copyMakeBorder(dst, dst2, 20, 20, 20, 20, cv::BORDER_CONSTANT, Scalar(116, 73, 16));
//閾值化操作
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow(output, CV_WINDOW_AUTOSIZE);
imshow("input", dst);
createTrackbar("閾值滑條:", output, &threshold_value, threshold_max, Threshold_Demo);
//imwrite("D:/PT/shan/shan12345.jpg",dst2);
Threshold_Demo(0, 0);
waitKey(0);
return 0;
}
void Threshold_Demo(int, void*) {
cvtColor(dst, gray_dst, CV_BGR2GRAY);
threshold(gray_dst, dst2, threshold_value, threshold_max, THRESH_BINARY);
imshow(output, dst2);
}


注:這里可以暫停思考一下,為什么閾值拉低,黑色逐漸減少,白色逐漸增多,
cv2.THRESH_BINARY_INV:反二值化:

3、OTSU演算法(大津法)
什么是大津法?
大津法是一種影像灰度自適應的閾值分割演算法,又稱作最大類間方差法,因為按照大津法求得的閾值進行影像二值化分割后,前景與背景影像的類間方差最大,
它被認為是影像分割中閾值選取的最佳演算法,計算簡單,不受影像亮度和對比度的影響,因此在數字影像處理上得到了廣泛的應用,它是按影像的灰度特性,將影像分成背景和前景兩部分,因方差是灰度分布均勻性的一種度量,背景和前景之間的類間方差越大,說明構成影像的兩部分的差別越大,當部分前景錯分為背景或部分背景錯分為前景都會導致兩部分差別變小,因此,使類間方差最大的分割意味著錯分概率最小,

應用:是求影像全域閾值的最佳方法,應用不言而喻,適用于大部分需要求影像全域閾值的場合,
優點:計算簡單快速,不受影像亮度和對比度的影響,
缺點:對影像噪聲敏感;只能針對單一目標分割;當目標和背景大小比例懸殊、類間方差函式可能呈現雙峰或者多峰,這個時候效果不好,




代碼鏈接:C++實作Otsu(大津法)
OpenCV學堂公眾號鏈接:二值化演算法OTSU原始碼決議
4、自適應閾值二值化
為什么要提出自適應呢?
對于色彩均勻的影像,一個閾值就可以完成,但是色彩不均勻,影像光照變暗了,單閾值的二值化效果就會大大折扣,
自適應閾值可以使用變換的閾值,通過計算每個像素點臨近區域的甲醛平均值獲得閾值,然后處理,這個方法可以更好地處理明暗差異較低的影像,
OpenCV提供的API:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,
int adaptiveMethod, int thresholdType, int blockSize, double C)
src:源影像,8位單通道影像,
adaptiveMethod:在一個鄰域內計算閾值所采用的演算法,分別為:
ADAPTIVE_THRESH_MEAN_C (鄰域所有像素點的權重值是一致的)-double C
ADAPTIVE_THRESH_GAUSSIAN_C (與鄰域各個像素點到中心的距離有關,通過高斯方程得到各個點的權重值)-double c
thresholdType:
THRESH_BINARY
THRESH_BINARY_INV
blockSize:adaptiveThreshold的計算單位是像素的鄰域塊,這是區域鄰域大小,3、5、7…
double C:偏移值調整量.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293061.html
標籤:其他
上一篇:SSD+LBP實作人臉識別
