數字圖像處理——圖像增強


圖像增強

圖像增強的目的是:改善圖像的視覺效果或使圖像更適合於人或機器的分析處理

\[圖像增強 \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)\)為其自變量

直接灰度變換又可以分為:

  • 線性變換
  • 分段線性變換
  • 非線性變換
線性變換 & 分段線性變換

image.png

對於\(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;
			}
		}
	}

效果圖:

圖像增強.png

非線性灰度變換

\[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

圖像略

直方圖性質

  1. 直方圖未反映某一灰度級像素所在位置,即丟失了位置信息
  2. 一幅圖像對應一個灰度直方圖,但是不同的圖像可能有相同的直方圖
  3. 灰度直方圖具有可加性,整幅圖像的直方圖等於素有不重疊子區域的直方圖之和

直方圖用途

  1. 反映圖像的亮度、對比度、清晰度。用來判斷一幅圖像是否合理地利用了全部被允許的灰度級范圍
  2. 圖像分割閾值選取,如果某圖像的灰度直方圖具有二峰性,那么這個圖像的較亮區域與較暗區域可以較好分離,取谷底做為閾值點

直方圖計算

先求出圖像灰度級總數,然后遍歷圖像,對應像素點的灰度級的像素個數++,最后歸一化即可

直方圖均衡化

目的:將\(p_r(k_r)\) 修正為均勻分布形式,使動態范圍增加,圖像清晰度增加,對比度增加

方法:

  1. 求出灰度直方圖
  2. 計算累積分布\(p'_s(s_k) = \sum_{j=0}^kp_r(r_j)\)
  3. 計算新的灰度值\(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);
}

直方圖均衡化.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM