閾值二值化 cv:threshold
輸入爲灰度圖像
threshold(src, dst, 127, 255, THRESH_BINARY);
reshold(src //輸入
dst //輸出
thresh //閾值
maxValue //二值化最大值
thresholdType //閾值類型 CV_THRESH_OTSU
)
自適應閾值 cv::adaptiveThreshold
adaptiveThreshold(gray, dst2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5,8); //自適應閾值,高斯分佈 5*5. 閾值爲高斯均值-8
adaptiveThreshold(
InputArry src,
OutputArrt dst,
double maxValue //設置最大值
int adaptiveMethod //均值或高斯取值
//ADAPTIVE_THRESH_MEAN_C
//ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType //閾值類型
int blockSize //方框邊長 爲奇數
double C //閾值未取高斯閾值-C
}
平滑與濾波
簡單模糊 blur
blur(mat, img_blur, Size(11, 11), Point(-1, -1));//均值模糊
void blur(
InpurArry src,
OutputArry dst,
Size Ksize //模糊盒裝塊大小
Point anchor //核的位置一般未Point(-1,-1),表示居中
int borderType //一般不輸入
)
高斯模糊 GaussianBlur
GaussianBlur(mat, img_gar, Size(11, 11), 11, 11);
void GaussianBlur(
InpurArry src,
OutputArry dst,
Size Ksize //模糊盒裝塊大小
double sigmaX //X方向方差
double sigmaY //Y方向方差
int borderType //沒用
)
中值濾波器(去除黑白點)
medianBlur(src, dst, 11);
void medianBlur(InputArray src, OutputArray dst, int ksize);//ksize方塊邊長
雙邊濾波器(邊緣保留) bilateralFilter
邊界在,細節被濾去
bilateralFilter(src, dst, 15, 150, 3);
//15計算半徑, 150 決定多少差值之內的像素會被計算,3如果d大於0則無效,否則用他來計算d的值
//邊緣保留的濾波算法
void bilateralFilter(InputArray src, OutputArray dst,
int d, //半徑
double sigmaColor, //顏色權重函數的寬度參數,差值之內的被計算
double sigmaSpace, //空間權函數的寬度參數
int borderType = BORDER_DEFAULT
);
任意線性濾波器做卷積
每一個圖元與算子進行卷積來達到濾波的目的
Robert算子:45度方向求導數
Sobel算子:x y方向求導數
拉普拉斯算子:全導數
卷積函數:
void filter2D( InputArray src, OutputArray dst,
int ddepth, //深度,不知道的寫 -1
InputArray kernel, //卷積算子
Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
索貝爾函數:
Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, //求導順序取值0 1 2,0表示不求導
int ksize = 3,
double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
拉普拉斯變換函數 (二次求導取出邊緣)
void Laplacian( InputArray src, OutputArray dst, int ddepth,
int ksize = 1, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
圖像形態學
膨脹與腐蝕
目標像素點的值替換爲卷積核覆蓋區域 的局部最大(小)值
先獲得圖元getStructuringElement
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
//ship MORPH_RECT(一般是)(長方形) \MORPH_CROSS\MORPH_ELLIPSE
//esize 如Size(s*s) s爲奇數,指的是卷積核覆蓋區域大小
//錨點默認Point(-1, -1))指中心
膨脹 dilate
dilate(src, dst, structure, Point(-1, -1));
void dilate(InputArray src, OutputArray dst, //輸入輸出
InputArray kernel, //輸入圖元
Point anchor = Point(-1, -1), int iterations = 1,
int borderType = BORDER_CONSTANT, //暫時沒用,不用輸入
const Scalar& borderValue = morphologyDefaultBorderValue() //暫時沒用,不用輸入
);
腐蝕 erode
erode(src, dst, structure, Point(-1, -1));//同膨脹
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
形態學操作:
CV_MOP_OPEN | 開操作 | 先腐蝕,後膨脹,可以去掉小的對象。 |
CV_MOP_CLOSE | 閉操作 | 先膨脹,後腐蝕,可以填充小的洞。 |
CV_MOP_GRADIENT | 形態學梯度 | 膨脹減去腐蝕 gradient(src)=dilate(src)-erode(src),高亮圖中變化劇烈的部分 |
CV_MOP_TOPHAT | 頂帽 | 原圖像與開操作圖像的差值,明亮的局部(黑線條的背光)被提取出來 |
CV_MOP_BLACKHAT | 黑帽 | 閉圖像與原圖像的差值,暗洞(黑線條)被提取出來 |
void morphologyEx( InputArray src, OutputArray dst,
int op, //選擇形態學操作,如開操作 CV_MOP_OPEN ,閉操作CV_MOP_CLOSE
InputArray kernel,//輸入結構元素,圖元
Point anchor = Point(-1,-1), //位置,默認中心
int iterations = 1, //迭代次數,默認1
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );