一、幾何變換
7.圖像的插值
(1)原理介紹
下面對比三種插值方法,分別是最近鄰插值法、雙線性插值法、卷積插值法,三種方法的前提和特點、優(yōu)缺點、適用場景如下:
-
最近鄰插值(Nearest Neighbor Interpolation):
- 前提與特點:這是最簡單的插值方法,不考慮相鄰像素的影響,只取最近的像素值。對于每個新像素點,此方法找到最近的原始輸入像素點并直接賦予其灰度值。
- 優(yōu)點:計算速度快,沒有引入新的顏色(對于彩色圖像),在某些應(yīng)用中保留了像素的原始值。
- 缺點:圖像質(zhì)量通常不是最優(yōu)的,可能會出現(xiàn)鋸齒狀邊緣和像素化的效果,特別是在放大較大比例時。
- 適用場景:適用于需要實時處理的場景,或者當(dāng)圖像放大倍數(shù)較小,對圖像細(xì)節(jié)要求不高時。
-
雙線性插值(Bilinear Interpolation):
- 前提與特點:此方法考慮了像素周圍的2x2鄰域,通過線性插值算法基于周圍四個最近的像素點,對于新的像素點進(jìn)行灰度值的估算。
- 優(yōu)點:比最近鄰插值算法圖像質(zhì)量更好,可以得到更加平滑的圖像邊緣,沒有那么明顯的鋸齒、像素化現(xiàn)象。
- 缺點:相比于最近鄰插值,雙線性插值計算量更大,處理速度稍慢。
- 適用場景:適用于圖像質(zhì)量要求較高的場合,同時可以接受一定程度的模糊。
-
雙立方插值(Bicubic Interpolation):
- 前提與特點:此方法使用像素周圍的4x4鄰域進(jìn)行插值,是一種更為復(fù)雜的算法,通過多項式插值,對圖像中的像素值進(jìn)行估算。
- 優(yōu)點:相比于最近鄰和雙線性插值,雙立方插值通??梢缘玫礁交⑦吘壐黉忼X的圖像,并且在保留更多圖像細(xì)節(jié)方面更為出色。
- 缺點:計算量大,處理速度較慢,可能會引入一些偽影。
- 適用場景:適合對圖像質(zhì)量要求非常高的應(yīng)用,比如專業(yè)的圖像編輯和打印。
(2)完整代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖片并轉(zhuǎn)換為灰度圖
image = cv2.imread('cell.jpg', cv2.IMREAD_GRAYSCALE)
# 確保圖片大小為224x234
if image.shape != (234, 224):
image = cv2.resize(image, (224, 234), interpolation=cv2.INTER_LINEAR)
# 最近鄰插值法
nearest = cv2.resize(image, (448, 468), interpolation=cv2.INTER_NEAREST)
# 雙線性插值法
bilinear = cv2.resize(image, (448, 468), interpolation=cv2.INTER_LINEAR)
# 雙立方插值法(卷積插值法通常指的是雙立方插值)
bicubic = cv2.resize(image, (448, 468), interpolation=cv2.INTER_CUBIC)
# 創(chuàng)建一個橫排的子圖,顯示三種不同的插值結(jié)果
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5))
# 設(shè)置每個子圖的標(biāo)題
axes[0].set_title('Nearest Neighbour')
axes[1].set_title('Bilinear')
axes[2].set_title('Bicubic')
# 在子圖中顯示對應(yīng)的插值結(jié)果圖像
axes[0].imshow(nearest, cmap='gray')
axes[1].imshow(bilinear, cmap='gray')
axes[2].imshow(bicubic, cmap='gray')
# 關(guān)閉子圖各自的坐標(biāo)軸
for ax in axes:
ax.axis('off')
# 調(diào)整子圖之間的間隔
plt.subplots_adjust(wspace=0.05, hspace=0)
# 顯示圖像
plt.show()
(3)運(yùn)行結(jié)果
二、離散傅里葉變換
(1)原理介紹
1)原理:
在二維圖像中,DFT將圖像從空間域(其中每個像素位置表示一個點的亮度或顏色強(qiáng)度)轉(zhuǎn)換到頻域(其中每個點表示一個特定頻率和方向上的信號強(qiáng)度)。這個頻域表示讓我們能夠觀察到圖像中的周期性和非周期性模式。
圖像的DFT生成復(fù)數(shù)輸出,其中實部代表余弦(cosine)波的幅度,虛部代表正弦(sine)波的幅度。圖像中的每一個點都可以看作是許多不同頻率和方向的正弦和余弦波的疊加。
2)適用場景:
-
頻域濾波:在頻域中,可以對圖像進(jìn)行低通、高通和帶通濾波等操作,用于平滑圖像(去噪)或增強(qiáng)邊緣等。
-
圖像分析:通過分析圖像的頻域表示,可以識別圖像中的周期性模式、分析紋理或者進(jìn)行圖像壓縮。
-
圖像增強(qiáng):一些圖像增強(qiáng)的技術(shù),如銳化或?qū)Ρ榷仍鰪?qiáng),也可以通過調(diào)整圖像的頻域成分來實現(xiàn)。
-
圖像重建:利用逆傅里葉變換可以重建圖像,這在圖像壓縮和傳輸中非常有用。
-
水印和隱寫術(shù):嵌入信息或水印到圖像的特定頻率成分中,這樣在空間域中這些信息幾乎是不可見的。
-
特征提取:在計算機(jī)視覺和圖像處理中,頻域特征可以用于圖像識別和分類。
3)注意事項:
- 離散傅里葉變換對于數(shù)據(jù)的周期性和非周期性特征都非常敏感,因此在應(yīng)用DFT之前通常需要對圖像邊緣進(jìn)行處理,如使用窗函數(shù),以減少邊界效應(yīng)。
- DFT變換后的圖像一般將低頻部分放在圖像中心,因為在自然圖像中,高頻通常代表著邊緣和噪聲,而低頻則對應(yīng)于圖像的整體構(gòu)成。
(2)完整代碼
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 讀取圖像
image = cv2.imread('cell.jpg', cv2.IMREAD_GRAYSCALE)
# 檢查圖像是否正確讀取
if image is None:
raise ValueError("Could not open or find the image. Check the path.")
# 對圖像進(jìn)行離散傅里葉變換
dft = np.fft.fft2(image)
# 將DFT輸出中的低頻成分移動到數(shù)組的中心
dft_shifted = np.fft.fftshift(dft)
# 計算幅度譜
magnitude_spectrum = 20 * np.log(np.abs(dft_shifted))
# 創(chuàng)建一個橫排的顯示圖像和頻域圖像的新圖
plt.figure(figsize=(12, 6))
# 顯示原始圖像
plt.subplot(1, 2, 1) # (rows, columns, panel number)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')
# 顯示頻域圖像
plt.subplot(1, 2, 2)
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum')
plt.axis('off')
# 顯示圖像
plt.tight_layout() # 調(diào)整子圖,使之填充整個圖像區(qū)域
plt.show()
(3)運(yùn)行結(jié)果
(4)與沃爾什-哈達(dá)瑪變換(WHT)和離散余弦變換(DCT)的對比
????????說到DFT,有的教材就會提到另外兩種頻域變換方法:沃爾什-哈達(dá)瑪變換(WHT)和離散余弦變換(DCT),三者最主要的區(qū)別就是:WHT最快,并且對二值化圖像處理效果最好,但圖片尺寸必須2的冪(或你愿意預(yù)處理成2的冪);DCT常用于JPEG圖像的圖像壓縮,但不涉及復(fù)數(shù)運(yùn)算;DFT慢一點,但是常用于濾波、去噪、復(fù)原。詳細(xì)的對比如下:
1. 離散傅里葉變換(DFT)
適用場景:
- 頻域分析:如果您需要分析圖像中的頻率成分,例如確定圖像的紋理信息或頻率特征,DFT是理想的選擇。
- 頻域濾波:如果您的目的是移除圖像中的噪聲(通常在高頻區(qū)域)或強(qiáng)調(diào)某些紋理(低頻信息),使用DFT之后可以應(yīng)用各種頻域濾波器。
- 圖像去噪:通過DFT,可以設(shè)計濾波器來抑制噪聲頻率,然后通過逆變換恢復(fù)圖像。
- 圖像復(fù)原:在圖像復(fù)原中,通過頻域分析可以識別并補(bǔ)償成像系統(tǒng)的模糊函數(shù)。
選擇條件:
- 需要分析或處理圖像的頻率內(nèi)容。
- 計算復(fù)雜度不是主要關(guān)心的問題,或者可以接受稍長的計算時間。
2. 沃爾什-哈達(dá)瑪變換(WHT)
適用場景:
- 快速計算:當(dāng)需要非常高效的計算時,WHT由于其簡單的+1和-1操作,可以比DFT或DCT更快地實現(xiàn)。
- 二值圖像:對于二值圖像或其他只有兩種值的圖像,WHT可能尤其有用。
- 數(shù)據(jù)加密和水印:WHT可用于快速加密信息或嵌入水印,因為它對圖像的局部變化不敏感。
選擇條件:
- 計算效率是優(yōu)先考慮的問題,特別是對于實時系統(tǒng)。
- 圖像尺寸必須是2的冪,或者您愿意對圖像進(jìn)行相應(yīng)的預(yù)處理。
3. 離散余弦變換(DCT)
適用場景:
- 圖像壓縮:DCT在JPEG圖像壓縮中非常常用,它能夠?qū)D像能量集中在較少的系數(shù)中,使得壓縮效率高。
- 去噪:類似于DFT,DCT也可以用于圖像去噪,但通常更有效,因為實際圖像的能量大多集中在DCT的低頻系數(shù)中。
- 圖像增強(qiáng):如果要增強(qiáng)圖像的某些特征,DCT可以幫助分離出重要的頻率成分并進(jìn)行處理。
選擇條件:
- 對圖像執(zhí)行壓縮或需要高效的能量集中變換。
- 對實數(shù)操作有偏好,因為DCT不涉及復(fù)數(shù)計算。
4.完整代碼
import numpy as np
import matplotlib.pyplot as plt
import cv2
from scipy.fftpack import dct, idct
from scipy.linalg import hadamard
# 讀取圖像
image = cv2.imread('cell.jpg', cv2.IMREAD_GRAYSCALE)
# 檢查圖像是否正確讀取
if image is None:
raise ValueError("Could not open or find the image. Check the path.")
# 離散傅里葉變換 (DFT)
dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft) # 將低頻分量移動到中心
dft_magnitude = np.log(np.abs(dft_shift))
# 離散余弦變換 (DCT)
dct_transformed = dct(dct(image.T, norm='ortho').T, norm='ortho')
# 沃爾什-哈達(dá)瑪變換 (WHT)
# 由于WHT需要尺寸為2的冪,因此可能需要調(diào)整圖像尺寸
dim = 2 ** int(np.ceil(np.log2(max(image.shape))))
padded_image = np.pad(image, ((0, dim - image.shape[0]), (0, dim - image.shape[1])), 'constant', constant_values=0)
hadamard_transformed = hadamard(dim)
wht_transformed = hadamard_transformed @ padded_image @ hadamard_transformed
wht_magnitude = np.log(np.abs(wht_transformed))
# 顯示圖像
plt.figure(figsize=(18, 6))
# 顯示DFT
plt.subplot(1, 3, 1)
plt.imshow(dft_magnitude, cmap='gray')
plt.title('Discrete Fourier Transform')
plt.axis('off')
# 顯示DCT
plt.subplot(1, 3, 2)
plt.imshow(dct_transformed, cmap='gray')
plt.title('Discrete Cosine Transform')
plt.axis('off')
# 顯示W(wǎng)HT
plt.subplot(1, 3, 3)
plt.imshow(wht_magnitude, cmap='gray')
plt.title('Walsh-Hadamard Transform')
plt.axis('off')
plt.tight_layout()
plt.show()
5.運(yùn)行結(jié)果
6.方法選擇
假設(shè)您有一張照片,您需要根據(jù)照片的特點和您要實現(xiàn)的功能來確定使用哪種方法。以下是一些指導(dǎo)性的問題:
-
您的目標(biāo)是什么?
- 如果您需要壓縮或者進(jìn)行簡單的頻域去噪,DCT可能是最佳選擇。
- 如果是進(jìn)行深入的頻域分析或者復(fù)雜的頻域濾波,DFT可能更合適。
- 如果需要快速變換或者數(shù)據(jù)加密,并且圖像大小合適,WHT可能是一個好的選擇。
-
圖像的特性是什么?
- 對于典型的自然圖像,DCT通常是最有效的,因為它能夠集中圖像能量。
- 對于含有大量細(xì)節(jié)或者高頻信息的圖像,DFT可能會提供更多的信息。
- 對于二值圖像或者圖像尺寸已經(jīng)是2的冪的情況,WHT可能更有優(yōu)勢。
-
計算效率要求如何?
- 如果需要快速處理,WHT可能是最快的,尤其是在尺寸合適的情況下。
- 如果效率不是主要關(guān)心點,那么DFT和DCT都是可行的,具體取決于上述的其他因素。
三、圖像增強(qiáng)
1.對比度增強(qiáng)
(1)灰度線性變換與灰度分段線性變換
1)原理介紹
灰度線性變換
原理: 灰度線性變換涉及將圖像的每一個像素值按照一個簡單的規(guī)則進(jìn)行調(diào)整,這個規(guī)則會讓所有像素變得更亮或更暗,并且可以改變圖像的對比度。換句話說,這種變換就像調(diào)整電視或者顯示器的亮度和對比度控制鈕。
使用場景:
- 當(dāng)整張圖像看起來太暗或者太亮?xí)r,可以通過灰度線性變換來統(tǒng)一調(diào)整圖像的亮度。
- 當(dāng)整個圖像的對比度不夠,顯得很平淡無力時,可以通過這種變換來提高對比度,使得圖像中的明暗部分更加突出。
灰度分段線性變換
原理: 灰度分段線性變換比灰度線性變換復(fù)雜一些,它允許你對圖像中不同亮度區(qū)域進(jìn)行不同方式的調(diào)整。這意味著你可以選擇只提亮圖像中的暗部分,而保持亮部分不變,或者反過來,也可以對亮度中等的區(qū)域進(jìn)行調(diào)整,而不影響其他區(qū)域。
使用場景:
- 對于一張圖像,如果某些部分太暗而另一些部分又太亮,灰度分段線性變換可以分別調(diào)整這些部分,達(dá)到一個較好的整體視覺效果。
- 在需要特別強(qiáng)調(diào)或隱藏圖像一部分細(xì)節(jié)時,這種變換可以局部地增強(qiáng)或減弱對比度。
對比文章來源:http://www.zghlxwxcb.cn/news/detail-839142.html
- 簡單與復(fù)雜:灰度線性變換比較簡單,適用于全局性的圖像調(diào)整;而灰度分段線性變換更復(fù)雜,適用于更細(xì)致和定制化的調(diào)整。
- 靈活性:線性變換對所有像素使用相同的規(guī)則,不夠靈活;分段線性變換可以對圖像的不同部分使用不同的規(guī)則,更具靈活性。
- 應(yīng)用范圍:灰度線性變換適用于整個圖像需要改善的情況,例如整體亮度調(diào)整;灰度分段線性變換適用于圖像的局部區(qū)域需要不同程度的調(diào)整,例如同時調(diào)整陰影和高光。
2)完整代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
image = cv2.imread('cell.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
raise ValueError("Could not open or find the image. Check the path.")
# 灰度線性變換
def linear_transform(image, alpha=1.5, beta=0):
# 新圖像 = alpha * 原圖像 + beta
new_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
return new_image
# 灰度分段線性變換
def piecewise_linear_transform(image):
# 這里定義了一個簡單的分段線性函數(shù),實際函數(shù)可能需要根據(jù)需求調(diào)整
new_image = np.zeros_like(image)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if image[i, j] < 128:
new_image[i, j] = image[i, j] * 0.5
else:
new_image[i, j] = image[i, j] * 1.5
# 確保值在0-255之間
new_image[new_image > 255] = 255
return new_image
# 應(yīng)用變換
linear_image = linear_transform(image)
piecewise_image = piecewise_linear_transform(image)
# 顯示圖像
plt.figure(figsize=(15, 5))
# 顯示原始圖像
plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')
# 顯示線性變換后的圖像
plt.subplot(1, 3, 2)
plt.imshow(linear_image, cmap='gray')
plt.title('Linear Transformation')
plt.axis('off')
# 顯示分段線性變換后的圖像
plt.subplot(1, 3, 3)
plt.imshow(piecewise_image, cmap='gray')
plt.title('Piecewise Linear Transformation')
plt.axis('off')
plt.tight_layout()
plt.show()
3)運(yùn)行結(jié)果
(2)灰度對數(shù)變換與灰度指數(shù)變換
1)原理介紹
灰度對數(shù)變換
原理: 灰度對數(shù)變換的基本思想是對圖像的低亮度值進(jìn)行更強(qiáng)的變換而對高亮度值進(jìn)行較弱的變換。這種變換能夠?qū)D像中的暗區(qū)域中的細(xì)節(jié)拉伸,而壓縮亮區(qū)域的對比度。這有助于在圖像的暗部分透露更多細(xì)節(jié)。
使用場景:
- 當(dāng)圖像中有很多陰暗區(qū)域,并且這些區(qū)域中的細(xì)節(jié)被隱藏時,灰度對數(shù)變換可以使這些細(xì)節(jié)變得更明顯。
- 在圖像的動態(tài)范圍較大時(即圖像中同時包含很亮和很暗的區(qū)域),這種變換有助于降低動態(tài)范圍,讓整個圖像的細(xì)節(jié)都能夠較好地顯示出來。
灰度指數(shù)變換
原理: 灰度指數(shù)變換與對數(shù)變換相反,它對圖像高亮度區(qū)域的影響比暗區(qū)域要大。這意味著它可以增加圖像亮區(qū)域的對比度,使得圖像的亮部分更加明亮。
使用場景:
- 當(dāng)圖像的高亮區(qū)域細(xì)節(jié)不是很重要,而希望突出顯示暗部細(xì)節(jié)時,可以使用灰度指數(shù)變換。
- 在某些情況下,如果需要模擬圖像的視覺效果,使之看起來更亮或者更有光澤感,灰度指數(shù)變換也很有用。
對比
- 灰度對數(shù)變換通常用于增強(qiáng)圖像中的暗部細(xì)節(jié),它能夠?qū)祬^(qū)域的對比度提高,讓這些區(qū)域的內(nèi)容更易于觀察。
- 灰度指數(shù)變換則相反,它更多地增強(qiáng)了亮部的對比度,通常會使圖像的亮部更加亮麗。
2)完整代碼
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 讀取圖像并轉(zhuǎn)換為灰度
image_path = 'cell.jpg'
original_image = Image.open(image_path).convert('L')
image_array = np.array(original_image)
# 灰度對數(shù)變換
log_transformed = np.log1p(image_array) # np.log1p對數(shù)組中的每個元素進(jìn)行l(wèi)og(1+x)運(yùn)算
log_transformed = (log_transformed / log_transformed.max()) * 255 # 歸一化并擴(kuò)展到0-255范圍
log_image = Image.fromarray(np.uint8(log_transformed)) # 將數(shù)組轉(zhuǎn)換回圖像格式
# 灰度指數(shù)變換
# 為了避免數(shù)值過大,通常會將圖像數(shù)據(jù)先歸一化,指數(shù)變換后再還原
image_array_normalized = image_array / 255
exp_transformed = np.exp(image_array_normalized) # np.exp對數(shù)組中的每個元素進(jìn)行e^x運(yùn)算
exp_transformed = (exp_transformed / exp_transformed.max()) * 255 # 歸一化并擴(kuò)展到0-255范圍
exp_image = Image.fromarray(np.uint8(exp_transformed))
# 創(chuàng)建一個畫布顯示原圖和變換后的圖像
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# 顯示原圖
axes[0].imshow(original_image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
# 顯示對數(shù)變換圖像
axes[1].imshow(log_image, cmap='gray')
axes[1].set_title('Log Transformation')
axes[1].axis('off')
# 顯示指數(shù)變換圖像
axes[2].imshow(exp_image, cmap='gray')
axes[2].set_title('Exponential Transformation')
axes[2].axis('off')
# 展示圖像
plt.tight_layout()
plt.show()
3)運(yùn)行結(jié)果
文章來源地址http://www.zghlxwxcb.cn/news/detail-839142.html
到了這里,關(guān)于Python圖像處理:1.插值、頻域變換與對比度增強(qiáng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!