目錄
- 一.影像增強
- 1.什么是影像增強
- 2.為什么要影像增強
- 3.影像增強的目的
- 4.影像增強方法分類和方法程序
- 二.基本概念
- 1.影像的灰度變換
- 三.灰度線性變換
- 1.線性變換
- 2.分段線性變換
- 3.非線性變換
一.影像增強
1.什么是影像增強
影像增強是對影像進行加工,以得到對具體應用來說視覺效果更“好”,或更“有用”的影像的技術,
2.為什么要影像增強
影像在傳輸或者處理程序中會引入噪聲或使影像變模糊,從而降低了影像質量,甚至淹沒了特征,給分析帶來了困難,
3.影像增強的目的
①改善影像的視覺效果,提高影像的清晰度;
②將影像轉換成一種更適合于人或機器分析處理的形式,
③注意:在影像增強的程序中,沒有新資訊的增加,只是通過壓制一部分資訊,從而突出另一部分資訊,
4.影像增強方法分類和方法程序
(1)空域法
直接對影像的像素灰度值進行操作,
包括影像的灰度變換、直方圖修正、平滑和銳化處理、彩色增強等,

(2)頻域法
在影像的變換域中,對影像的變換值進行操作,然后經逆變換獲得所需的增強結果,
常用的方法包括低通濾波、高頻提升濾波以及同態濾波法等,

二.基本概念
1.影像的灰度變換
設原影像為f(m,n),處理后為g(m,n),則對比度增強可表示為:

其中,T[i]表示增強影像和原影像的灰度變換關系(函式),
三.灰度線性變換
1.線性變換
設原影像灰度值f(m,n)∈[a,b],線性變換后的取值g(m,n)∈[c,d],變換關系為:

其中
稱為變換函式(直線)的斜率,

2.分段線性變換
(1)擴展興趣的,犧牲其他
對于感興趣的[a,b]區間,采用斜率大于1的線性變換來擴展,而把其他區間用a或b來表示,變換函式為


(2)擴展興趣的,壓縮其他
在擴展感興趣的[a,b]區間的同時,為了保留其他區間的灰度層次,也可以采用其他區間壓縮的方法,即有擴有壓,變換函式為:


/*對比度拉伸-分段線性變換*/
void Contrast_stretch(Mat& src,Mat& dst,double a,double b,double c,double d)
{
src.copyTo(dst);
dst.convertTo(dst, CV_64F);
double min = 0, max = 0;
minMaxLoc(dst, &min, &max, 0, 0); //在dst矩陣中找到全域最大值和全域最小值(只能用于單通道)
int nr = dst.rows;
int nc = dst.cols * dst.channels();
if (dst.isContinuous()) //若存盤連續(行與行之間的存盤),則可將影像看做一個一維陣列
{
int nr = 1;
int nc = dst.cols * dst.rows * dst.channels();
}
for (int i = 0; i < nr; i++)
{
double* ptr_dst = dst.ptr<double>(i); //指向第i行第一個元素的指標
for (int j = 0; j < nc; j++)
{
if (min <= ptr_dst[j] < a)
{
ptr_dst[j] = (c / a) * ptr_dst[j];
}
else if (a <= ptr_dst[j] < b)
{
ptr_dst[j] = ((d - c) / (b - a)) * ptr_dst[j];
}
else if (b <= ptr_dst[j] < max)
{
ptr_dst[j] = ((max - d) / (max - b)) * ptr_dst[j];
}
}
}
dst.convertTo(dst, CV_8U); //轉回無符號八位影像
}

3.非線性變換
(1)對數變換

其中λ為一個調節常數,用它來調節變換后的灰度值,使其符合實際要求,
對數變換的作用是擴展影像的低灰度范圍,同時壓縮高灰度范圍,使得影像灰度分布均勻,與人的視覺特性相匹配,反對數變換與之相反,

對數函式有個重要特征:它壓縮像素值變化較大的影像的動態范圍,通常,頻譜值的范圍從0到106,甚至更高,盡管計算機能毫無問題地處理這一范圍的數字,但影像的顯示系統通常不能如實地再現如此大范圍的灰度值,因而,最終結果是許多重要的灰度細節在典型的傅里葉頻譜的顯示中丟失了,
/*對數變換*/
void Log_trans(Mat& src, Mat& dst, double c)
{
int nr = src.rows;
int nc = src.cols * src.channels();
src.copyTo(dst);
dst.convertTo(dst, CV_64F);
if (src.isContinuous() && dst.isContinuous())
{
nr = 1;
nc = src.rows * src.cols * src.channels();
}
for (int i = 0; i < nr; i++)
{
const uchar* srcdata = src.ptr<uchar>(i); //獲取第i行首地址
double* dstdata = dst.ptr<double>(i);
for (int j = 0; j < nc; j++)
{
dstdata[j] = c * log(double(1.0 + srcdata[j]));
}
}
normalize(dst, dst, 0, 255, NORM_MINMAX); //歸一化資料,
dst.convertTo(dst, CV_8U);
}

(2)指數變換
與對數變換的效果相反,指數變換使得高灰度范圍得到擴展,而壓縮了低灰度范圍,

其中λ和γ為常數,為避免底數為0的情況,增加偏移量ε,γ值的選擇對于變換函式的特性有很大影響,當γ<1時會將原影像的灰度向高亮度部分映射,當γ>1時向低亮度部分映射,而當γ=1時相當于正比變換,
(3)冪律(伽馬)變換

其中c和γ是正常數;
γ<1提高灰度級,在正比函式上方,使影像變亮;
γ>1降低灰度級,在正比函式下方,使影像變暗,

示例:

/*指數變換:c-系數;r-指數*/
void change_index(Mat& src, Mat& dst, double c, double r)
{
int nr = src.rows;
int nc = src.cols;
src.copyTo(dst);
dst.convertTo(dst, CV_64F);
if (src.isContinuous() && dst.isContinuous())
{
nr = 1;
nc = src.rows * src.cols * src.channels();
}
for (int i = 0; i < nr; i++)
{
const uchar* srcdata = src.ptr<uchar>(i); //獲取第i行首地址
double* dstdata = dst.ptr<double>(i);
for (int j = 0; j < nc; j++)
{
dstdata[j] = c * pow(srcdata[j], r);
}
}
normalize(dst, dst, 0, 255, NORM_MINMAX); //歸一化資料
dst.convertTo(dst, CV_8U);
}

參考文章:https://blog.csdn.net/weixin_40647819/article/details/88014295
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353555.html
標籤:其他
