圖像增強
圖像增強的目的是:改善圖像的視覺效果或使圖像更適合於人或機器的分析處理
\[圖像增強 \begin{cases} 空域法 \begin{cases} 點操作 \begin{cases} 直接灰度變換\\ 直方圖修正 \end{cases}\\ 鄰域操作 \begin{cases} 圖像平滑\\ 圖像銳化 \end{cases} \end{cases}\\ 頻域法 \begin{cases} 低通濾波\\ 高通濾波 \end{cases} \end{cases} \]
點操作
直接灰度變換
\(g(x,y)=T[f(x,y)]\)
\(T\) => 灰度映射函數
坐標位置 \((x,y)\) 為 \(f\) 的自變量,表示當前灰度值,經過函數\(T\) 轉變為\(g\),
注意在T函數中\(f(x,y)\)為其自變量
直接灰度變換又可以分為:
- 線性變換
- 分段線性變換
- 非線性變換
線性變換 & 分段線性變換
對於\(f(x,y)\)灰度范圍為\([a,b]\)的部分,進行線性變換
\[g(x,y) = {d-c\over b-a}[f(x,y)-a]+c \]
我們可以用它來做什么?
舉個簡單的例子,我們可以很容易的通過調整灰度分布,使得圖片白的部分更白,黑的部分更黑
void increase(Mat &inputImage, Mat& outputImage){
outputImage = inputImage.clone();
int rows = outputImage.rows;
int cols = outputImage.rows;
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){
Vec3b & tmp = outputImage.at<Vec3b>(i, j);
for (int k = 0; k < 3; k++){
if (tmp[k] < 48)
tmp[k] = tmp[k] / 1.5;
else if (tmp[k] > 191)
tmp[k] = (tmp[k] - 192) * 0.5 + 223;
else tmp[k] = (tmp[k] - 38) * 1.33;
}
}
}
效果圖:
非線性灰度變換
\[g(x,y)=clog_{10}[1+f(x,y)] \]
直方圖
在數字圖像處理中,直方圖是最簡單並且最有用的工具
灰度直方圖是灰度級的函數,描述的是圖像中該灰度級的像素個數
橫坐標表示灰度級,縱坐標表示圖像中該灰度級出現的像素個數
數據表示:
變量 | 含義 |
---|---|
n | 圖像的像素總數 |
L | 灰度級的個數 |
\(r_k\) | 第 k 個灰度級 |
\(n_k\) | 第 k 個灰度級的像素數 |
\(p_r(r_k)\) | 該灰度級出現的頻率 |
則 歸一化形式:
\[p_r(r_k) = {n_k\over n},~k = 0,1,2,\cdots,L-1 \]
公式利於歸納但是不利於理解,我們舉個例子說明:
原始圖像數據(每個位置上面的數字表示灰度級)
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
6 | 4 | 3 | 2 | 2 | 1 |
1 | 6 | 6 | 4 | 6 | 6 |
3 | 4 | 5 | 6 | 6 | 6 |
1 | 4 | 6 | 6 | 2 | 3 |
1 | 3 | 6 | 4 | 6 | 6 |
直方圖
灰度系數 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
像素個數 | 5 | 4 | 5 | 6 | 2 | 14 |
歸一化直方圖數據
1/6 | 2/6 | 3/6 | 4/6 | 5/6 | 6/6 |
---|---|---|---|---|---|
5/36 | 4/36 | 5/36 | 6/36 | 2/36 | 14/36 |
圖像略
直方圖性質
- 直方圖未反映某一灰度級像素所在位置,即丟失了位置信息
- 一幅圖像對應一個灰度直方圖,但是不同的圖像可能有相同的直方圖
- 灰度直方圖具有可加性,整幅圖像的直方圖等於素有不重疊子區域的直方圖之和
直方圖用途
- 反映圖像的亮度、對比度、清晰度。用來判斷一幅圖像是否合理地利用了全部被允許的灰度級范圍
- 圖像分割閾值選取,如果某圖像的灰度直方圖具有二峰性,那么這個圖像的較亮區域與較暗區域可以較好分離,取谷底做為閾值點
直方圖計算
先求出圖像灰度級總數,然后遍歷圖像,對應像素點的灰度級的像素個數++,最后歸一化即可
直方圖均衡化
目的:將\(p_r(k_r)\) 修正為均勻分布形式,使動態范圍增加,圖像清晰度增加,對比度增加
方法:
- 求出灰度直方圖
- 計算累積分布\(p'_s(s_k) = \sum_{j=0}^kp_r(r_j)\)
- 計算新的灰度值\(s_k=int[(L-1)p's(s_k)+0.5]\)
\(r_k\) | \(n_k\) | \(p_r(r_k)\) | \(p'_s(s_k)\) | \(s_k\) | \(N'_k\) | \(p_s(s_k)\) |
---|---|---|---|---|---|---|
0 | 790 | 0.19 | 0.19 | 1 | 0 | 0 |
1 | 1023 | 0.25 | 0.44 | 3 | 790 | 0.19 |
2 | 850 | 0.21 | 0.65 | 5 | 0 | 0 |
3 | 656 | 0.16 | 0.81 | 6 | 1023 | 0.25 |
4 | 329 | 0.08 | 0.89 | 6 | 0 | 0 |
5 | 245 | 0.06 | 0.95 | 7 | 850 | 0.21 |
6 | 122 | 0.03 | 0.98 | 7 | 985 | 0.24 |
7 | 81 | 0.02 | 1.00 | 7 | 488 | 0.11 |
新的 \(N'_k\) 由上一級的\(n_k\) 而來
//可以直接調用opencv庫寫好的方法
void equalization(Mat &input, Mat &output){
Mat imageRGB[3];
split(input, imageRGB);
for (int i = 0; i < 3;i++)
equalizeHist(imageRGB[i], imageRGB[i]);
merge(imageRGB, 3, output);
}