数字图像基本操作——图像采样、量化、算术运算、点运算实验结果及分析
一、實驗目的和要求
1.掌握Anaconda中搭建課程實驗環境的方法;
2.掌握讀、寫圖像的基本方法;
3.掌握python語言中圖像數據與信息的讀取方法;
4.掌握圖像基本屬性的操作方法;
5.掌握圖像的簡單運算方法;
二、實驗內容
1.使用Anaconda搭建課程實驗環境。
2.實現圖像模擬采樣的代碼。
3.實現圖像量化的代碼。
4.實現圖像算術運算的代碼。
5.實現圖像點運算的代碼。
三、實驗儀器、設備
Anaconda編程環境、pycharm
四、實驗原理
(一)圖像采樣
定義:采樣(Sampling)是指將空間上或時間上連續的圖象(模擬圖象)變換
成離散采樣點(象素)集合的一種操作。
采樣是對圖像空間坐標的離散化。分為均勻采樣和非均勻采樣。
對一幅圖像采樣時,若每行(即橫向)像素為N個,每列(即縱向)像素為M個,則圖像大小為M×N個像素,從而f(i,j)構成一個M×N實數矩陣:
把圖像分割成像素的方法是多種多樣的。即劃分的小區域可以是正方形的,
三角形的或六角形的。
(二)圖像量化
定義:量化是把采樣后所得的各像素灰度值從連續量到離散量的轉換稱為圖
像灰度的量化。
采樣圖像的量化方法:均勻量化和非均勻量化。
(三)圖像算術運算
算術運算也稱代數運算,指兩幅或兩幅以上的輸入圖像中對應像素的灰度值
做加、減、乘、除等運算,將對應位置像素值的運算結果作為輸出圖像相應像素
的灰度值。
設輸入圖像為A(x,y)、B(x,y),輸出圖像為C(x,y),則圖像的代數運算有
如下四種形式:
C(x,y)=A(x,y)+B(x,y)
C(x,y)=A(x,y)-B(x,y)
C(x,y)=A(x,y)×B(x,y)
C(x,y)=A(x,y)÷B(x,y)
(1)加法運算
用來生成疊加圖像
C(x,y)=A(x,y)+B(x,y);
可以得到各種合成圖象,也可以用于兩幅圖像的鑲嵌和濾波等。
(2)減法運算
C(x,y)=A(x,y)-B(x,y);
去除不需要的疊加圖像,檢測同一場景兩幅圖像之間的變化。
(四)圖像點運算
點運算輸出圖像每個像素的灰度值僅僅取決于輸入圖像中相對應像素的灰度值。冪次變換屬于其中的非線性點運算,圖像呈非線性關系。
該運算使圖像中具有中間灰度級的像素的灰度發生較大變化,而亮像素和暗像素只作較小變化。
五、實驗步驟
(一)使用Anaconda搭建課程實驗環境:
(1)下載并安裝Anaconda,Anaconda的國內鏡像:
Anaconda國內鏡像
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
(2)更新國內源
- condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- condaconfig--setshow_channel_urlsyes
- pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple
(3)配置虛擬環境
condacreate–nameDIPpython=3.7
condaactivateDIP
(4)安裝skimage和opencv及相關插件- pip installscikit-image
- pip installopencv-python
- pip installmatplotlib
(5)在pycharm中配置解釋器。
圖1.7 配置解釋器
五、實驗結果
1.實現圖像模擬采樣的代碼。
# 導入所需要的包 from skimage import data,io from matplotlib import pyplot as plt #from matplotlib import pylot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標簽 plt.rcParams['axes.unicode_minus']=False# 載入測試圖像 image=io.imread('cat.jpg') plt.subplot(1,2,1) plt.imshow(image) plt.title('原始圖片')print(image.shape) # 顯示圖像原始大小 print(type(image)) # 顯示圖像類型 ratio = 5 # 設置采樣比率 # 設置采樣后的圖片大小 image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32') # 對圖像進遍歷 for i in range(image1.shape[0]):for j in range(image1.shape[1]):for k in range(image1.shape[2]):delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k] # 獲取需要采樣的圖像塊image1[i, j, k] = np.mean(delta) # 計算均值,并存入結果圖像plt.subplot(1,2,2) plt.imshow(image1) plt.title('采樣后') plt.savefig('plt.jpg') plt.show()當采樣比率為20時,運行結果如下:
圖12 圖像采樣圖
當采樣比率為5時,運行結果如下:
圖13 圖像采樣圖
2.實現圖像量化的代碼。
from skimage import data from matplotlib import pyplot as pltimage=io.imread('cat.jpg')# 載入測試圖像 plt.subplot(1,2,1) plt.imshow(image) plt.title('原始圖片') radio =128 # 設置量化比率,128—2級,64—4級 for i in range(image.shape[0]):for j in range(image.shape[1]):for k in range(image.shape[2]):# 對圖像中每個像素進行量化image[i][j][k] = int(image[i][j][k] / radio) * radio plt.subplot(1,2,2) plt.imshow(image) plt.title('量化后') plt.savefig('plt.jpg') plt.show()將256級灰度的彩色圖像量化到僅有2級(每個像素所具有的離散灰度級數(不同灰度值的個數))的灰度圖像,運行結果如下:
圖14 圖像量化圖
將256級灰度的彩色圖像量化到僅有4級(每個像素所具有的離散灰度級數(不同灰度值的個數))的灰度圖像,運行結果如下:
圖15 圖像量化圖
3.實現圖像算術運算的代碼。
from skimage import data,io,color from matplotlib import pyplot as plt from matplotlib.font_manager import FontProperties font_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=12)sky=io.imread('starry_sky.jpg')# 載入測試圖像 sky=color.rgb2gray(sky)cat=io.imread('cat.jpg')# 載入測試圖像 cat=color.rgb2gray(cat)image_minus = sky - cat image_plus = sky + cat plt.set_cmap(cmap='gray')plt.subplot(2, 2, 1) plt.title('星空圖像', fontproperties=font_set) plt.imshow(sky)plt.subplot(2, 2, 2) plt.title('小貓圖像', fontproperties=font_set) plt.imshow(cat)plt.subplot(2, 2, 3) plt.title('星空加小貓圖像', fontproperties=font_set) plt.imshow(image_plus)plt.subplot(2, 2, 4) plt.title('星空減小貓圖像', fontproperties=font_set) plt.imshow(image_minus)plt.show()運行結果如下:
16 圖像算術運算圖
4.實現圖像點運算的代碼。
from skimage import data, io, exposure from matplotlib import pyplot as plt image=io.imread('cat.jpg')# 載入測試圖像 # 分別計算gamma=0.2,0.67,25時的圖像 image_1 = exposure.adjust_gamma(image, 0.2) image_2 = exposure.adjust_gamma(image, 0.67) image_3 = exposure.adjust_gamma(image, 25) # 分別展示原圖和結果圖像 plt.subplot(2, 2, 1) plt.title('gamma=1') io.imshow(image) plt.subplot(2, 2, 2) plt.title('gamma=0.2') io.imshow(image_1) plt.subplot(2, 2, 3) plt.title('gamma=0.67') io.imshow(image_2) plt.subplot(2, 2, 4) plt.title('gamma=25') io.imshow(image_3) plt.show()當gamma=1,0.2,0.67,25時,運行結果如下:
圖17 圖像點運算圖
六、實驗結果分析
(一)圖像采樣:采樣是圖像空間坐標的離散化,決定了圖像的空間分辨率,是對原始圖像信號的一種數字化逼近。從實驗結果可以得出:當采樣比率越低時,圖像的空間分辨率越高,越接近原圖像。(二)圖像量化:采樣后所得的各像素的灰度值從連續量到離散量的轉換稱為圖像灰度的量化。從實驗結果可以得出:圖像的量化比率決定了圖像的顏色精細程度。量化時確定的離散取值個數稱為量化級,減少量化級數值能增強圖像的反差。量化級越高,圖像質量越好。
(三)圖像算術運算:圖像運算是以圖像為單位,對圖像進行的數學操作,是數字圖像信號處理的基礎,運算對象以像素點為基本單位,運算結果為一幅灰度分布與原圖像不同的新圖像。
(1)加法運算:用來生成疊加圖像,可以得到各種合成圖象
(2)減法運算:去除不需要的疊加圖像,檢測同一場景兩幅圖像之間的變化。(四)圖像點運算:點運算只涉及一幅圖像(稱為輸入圖像),運算對象是輸入圖像像素的灰度值,即輸出圖像每個像素的灰度值僅取決于輸入圖像中對應像素的灰度值。點運算可以分為線性點運算和非線性點運算。
skimage的exposure模塊中包含冪次變換的函數adjust_gamma(gamma調整),可以對圖像進行冪次變換。冪次變換為非線性變換。
在生活中,很多圖像由于光線原因或者曝光率等問題,導致圖像過亮或過暗:因此,可以針對像素I進行冪指處理:其中,g是gamma參數。針對上式,從實驗運行結果可以得出:
(1)g>1,得到的圖像比原始圖像暗;
(2)g<1,得到的圖像比原始圖像亮。
八、實驗總結
(一)在采樣時,若橫向的像素數(列數)為M ,縱向的像素數(行數)為N,則圖像總像素數為MN個像素。采樣比率越高(間隔越大),所得圖像像素數越少,空間分辨率低,質量差,當采樣比率為20時,出現了馬賽克效應;采樣比率越低(間隔越小),所得圖像像素數越多,空間分辨率高,圖像質量好,但數據量大。
(二)圖像量化是將圖像采樣后的樣本值的范圍分為有限多個區域,落入某區域中的值用同一值表示,從而用有限的離散數值量來代替無限的連續模擬量。量化時確定的離散取值個數稱為量化級數。
若M、N為圖像尺寸,K為每個像素所具有的離散灰度級數(不同灰度值的個數)。存一幅圖像所需的位數(bit)B=MN*K ,當減少K值能增強圖像的反差。當K值增加時,越能真實反映原有圖像的顏色,但存儲的字節也越大。
因此,量化等級越多,所得圖像層次越豐富,灰度分辨率高,圖像質量好,但數據量大;量化等級越少,圖像層次欠豐富,灰度分辨率低,會出現假輪廓現象,圖像質量變差,但數據量小。
(三)圖像的加減法運算時要使用相同大小的圖像,就是兩個輸入圖像同一位置上的像素相加減,得到一個輸出圖像的過程。加法運算:用來生成疊加圖像,可以得到各種合成圖象,減法運算:去除不需要的疊加圖像,檢測同一場景兩幅圖像之間的變化。
(四)點運算是根據某種預先設置的規則,將輸入圖像各個像素本身的灰度逐一轉換成輸出圖像對應像素的灰度值。不會改變像素的空間位置。冪次變換屬于點運算中的非線性變換。通過函數adjust_gamma(gamma調整),可以對圖像進行冪次變換。凸顯圖像中某些部分。其公式為:
(1)g>1,得到的圖像比原始圖像暗;
(2)g<1,得到的圖像比原始圖像亮。
總結
以上是生活随笔為你收集整理的数字图像基本操作——图像采样、量化、算术运算、点运算实验结果及分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web渗透测试-Xss跨站脚本攻击(Cr
- 下一篇: 搭建测试环境步骤