OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機(jī)視覺庫,可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。最新版本是3.3 ,2017年8月3日發(fā)布。
OpenCV 擁有包括 500 多個C函數(shù)的跨平臺的中、高層 API。它不依賴于其它的外部庫——盡管也可以使用某些外部庫。
OpenCV 為Intel? Integrated Performance Primitives (IPP) 提供了透明接口。 這意味著如果有為特定處理器優(yōu)化的 IPP 庫, OpenCV 將在運(yùn)行時自動加載這些庫。
?。ㄗⅲ篛penCV 2.0版的代碼已顯著優(yōu)化,無需IPP來提升性能,故2.0版不再提供IPP接口)
二值化是圖像分割的一種方法。在二值化圖象的時候把大于某個臨界灰度值的像素灰度設(shè)為灰度極大值,把小于這個值的像素灰度設(shè)為灰度極小值,從而實現(xiàn)二值化。
根據(jù)閾值選取的不同,二值化的算法分為固定閾值和自適應(yīng)閾值。 比較常用的二值化方法則有:雙峰法、P參數(shù)法、迭代法和OTSU法等。
以下是opencv 圖像去噪學(xué)習(xí)總結(jié)
OpenCV圖像處理篇之圖像平滑
圖像平滑算法
程序分析及結(jié)果
圖像平滑算法
圖像平滑與圖像模糊是同一概念,主要用于圖像的去噪。平滑要使用濾波器,為不改變圖像的相位信息,一般使用線性濾波器,其統(tǒng)一形式如下:
其中h稱為濾波器的核函數(shù),說白了就是權(quán)值。不同的核函數(shù)代表不同的濾波器,有不同的用途。
在圖像處理中,常見的濾波器包括:
歸一化濾波器(Homogeneous blur)
也是均值濾波器,用輸出像素點(diǎn)核窗口內(nèi)的像素均值代替輸出點(diǎn)像素值。
高斯濾波器(Guassian blur)是實際中最常用的濾波器,高斯濾波是將輸入數(shù)組的每一個像素點(diǎn)與 高斯內(nèi)核 卷積將卷積和當(dāng)作輸出像素值。高斯核相當(dāng)于對輸出像素的鄰域賦予不同的權(quán)值,輸出像素點(diǎn)所在位置的權(quán)值最大(對應(yīng)高斯函數(shù)的均值位置)。二維高斯函數(shù)為,
中值濾波器(median blur)
中值濾波將圖像的每個像素用鄰域(以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替。對椒鹽噪聲最有效的濾波器,去除跳變點(diǎn)非常有效。
雙邊濾波器(Bilatrial blur)
為避免濾波器平滑圖像去噪的同時使邊緣也模糊,這種情況下使用雙邊濾波器。
下面的程序?qū)⑾冉o標(biāo)準(zhǔn)Lena圖像添加椒鹽噪聲,分別使用4種不同的濾波器進(jìn)行平滑操作,請注意觀察不
同濾波器對椒鹽噪聲的去噪效果!
程序分析及結(jié)果
/*
* FileName : image_smoothing.cpp
* Author : xiahouzuoxin @163.com
* Version : v1.0
* Date : Wed 17 Sep 2014 08:30:25 PM CST
* Brief :
*
* Copyright (C) MICL,USTB
*/
#include “cv.h”
#include “imgproc/imgproc.hpp”
#include “highgui/highgui.hpp”
using namespace std;
using namespace cv;
const int MAX_KERNEL_LENGTH = 10;
const char *wn_name = “Smoothing”;
static void salt(Mat &I, int n);
static void disp_caption(const char *wn_name, Mat src, const char *caption);
static void disp_image(const char *wn_name, Mat I);
/*
* @brief
* @inputs
* @outputs
* @retval
*/
int main(int argc, char *argv[])
{
if (argc《2) {
cout《《“Usage: 。/image_smoothing [file name]”《《endl;
return -1;
}
Mat I = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
salt(I, 6000);
imshow(wn_name, I);
waitKey(0);
Mat dst; // Result
/* Homogeneous blur */
disp_caption(wn_name, I, “Homogeneous blur”);
for (int i=1; i《MAX_KERNEL_LENGTH; i+=2) {
blur(I, dst, Size(i, i), Point(-1,-1));
disp_image(wn_name, dst);
}
/* Guassian blur */
disp_caption(wn_name, I, “Gaussian blur”);
for (int i=1; i《MAX_KERNEL_LENGTH; i+=2) {
GaussianBlur(I, dst, Size(i, i), 0, 0);
disp_image(wn_name, dst);
}
/* Median blur */
disp_caption(wn_name, I, “Median blur”);
for (int i=1; i《MAX_KERNEL_LENGTH; i+=2) {
medianBlur(I, dst, i);
disp_image(wn_name, dst);
}
/* Bilatrial blur */
disp_caption(wn_name, I, “Bilatrial blur”);
for (int i=1; i《MAX_KERNEL_LENGTH; i+=2) {
bilateralFilter(I, dst, i, i*2, i/2);
disp_image(wn_name, dst);
}
waitKey(0);
return 0;
}
/*
* @brief 顯示提示文字(濾波方法)
* @inputs
* @outputs
* @retval
*/
static void disp_caption(const char *wn_name, Mat src, const char *caption)
{
Mat dst = Mat::zeros(src.size(), src.type());
putText(dst, caption, Point(src.cols/4, src.rows/2), CV_FONT_HERSHEY_COMPLEX, 1, Scalar
?。?55,255,255));
imshow(wn_name, dst);
waitKey(0);
}
/*
* @brief 顯示圖像
* @inputs
* @outputs
* @retval
*/
static void disp_image(const char *wn_name, Mat I)
{
imshow(wn_name, I);
waitKey(1000);
}
/*
* @brief 添加椒鹽噪聲
* @inputs
* @outputs
* @retval
*/
static void salt(Mat &I, int n=3000)
{
for (int k=0; k《n; k++) {
int i = rand() % I.cols;
int j = rand() % I.rows;
if (I.channels()) {
I.at《uchar》(j,i) = 255;
} else {
I.at《Vec3b》(j,i)[0] = 255;
I.at《Vec3b》(j,i)[1] = 255;
I.at《Vec3b》(j,i)[2] = 255;
}
}
}
上面程序的邏輯非常清晰:
讀入灰度圖,并添加椒鹽噪聲(6000個噪聲點(diǎn)):
Mat I = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
salt(I, 6000);
LenaNoise
disp_caption和disp_image函數(shù)分別是用于顯示提示文字和平滑過程中的變化圖像的,平滑過程中圖像的
變化如下圖:
blur
注意觀察上面的圖,中值濾波(Median Blur)對椒鹽噪聲的效果最好!
四種濾波方法分別使用到4個OpenCV函數(shù),這些函數(shù)的聲明都在imgproc.hpp中,這些函數(shù)的前2個參數(shù)都
是原圖像和濾波后圖像。
歸一化濾波器blur的第3個參數(shù)為濾波核窗口的大小,Size(i,i)表示ixi大小的窗口。
高斯濾波器GaussianBlur第3個參數(shù)也是濾波核窗口的大小,第4、第5個參數(shù)分辨表示x方向和y方向的δ。
中值濾波器medianBlur第3個參數(shù)是濾波器的長度,該濾波器的窗口為正方形。
雙邊濾波器的函數(shù)原型如下:
//! smooths the image using bilateral filter
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType=BORDER_DEFAULT );
本程序使用的Makefile文件為:
TARG=image_smoothing
SRC=image_smoothing.cpp
LIB=-L/usr/local/lib/
INC=-I/usr/local/include/opencv/ -I/usr/local/include/opencv2
CFLAGS=
$(TARG):$(SRC)
g++ -g -o $@ ${CFLAGS} $(LIB) $(INC) \
-lopencv_core -lopencv_highgui -lopencv_imgproc \
$^
.PHONY:clean
clean:
-rm $(TARG) tags -f
========
評論
查看更多