日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 计算机视觉(六)—— OpenCV 进行图像量化与采样

發(fā)布時間:2025/3/19 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 计算机视觉(六)—— OpenCV 进行图像量化与采样 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于信號的采樣可以參考我之前的文章:數(shù)字信號處理 2.1 — 采樣

對于信號的量化可以參考:數(shù)字信號處理 2.4 — ADC 中的有限字長效應

在本篇文章中繪圖使用到了 matplotlib 庫,需要了解學習可以參考我之前寫的用來總結(jié)這個繪圖庫的文章:Python 繪圖庫 Matplotlib

目錄

1. 圖像量化與采樣處理

(1)基本概念

(2)量化操作

(2)采樣操作

2. 圖像金字塔

(1)基本概念

(2)操作實現(xiàn)

高斯金子塔下采樣

?拉普拉斯金子塔恢復原圖像

3. 局部馬賽克處理

(1)實現(xiàn)原理

(2)實戰(zhàn)操作

結(jié)束語


1. 圖像量化與采樣處理

經(jīng)典開頭讀取圖像信息:

""" Author:XiaoMa date:2021/10/22 """ #調(diào)用所需的包 import matplotlib.pyplot as plt import cv2 import numpy as np#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像 height = img1.shape[0] #shape[0] 圖像第一維度,高度 width = img1.shape[1] #shape[1] 圖像第二維度,寬度 print(img1.shape) print(width, height) cv2.namedWindow("W0") cv2.imshow("W0", img1) cv2.waitKey(delay = 0)

??

(1)基本概念

?此處參考:知乎文章

? ? ? ?把一幅圖像表示為二元函數(shù)形式:f(x, y),那么該函數(shù)在不同的坐標點有不同的幅度值,而這些幅度值是連續(xù)的,無法使用計算機進行處理,所以我們需要對幅度值進行離散化(數(shù)字化),這個過程即為圖像量化處理,一般常見的量化方式是將圖像用黑白兩種顏色表示,稱為二值圖像

? ? ? ?在之前的文章中提到一幅圖像可以表示為在 x 軸和 y 軸上連續(xù)的信號,但計算機無法處理連續(xù)信號,所以我們需要將圖像在這兩個維度進行離散化處理,該過程就稱為圖像的采樣處理,即對圖像的坐標軸進行數(shù)字化

(2)量化操作

? ? ? ? 具體代碼如下,都已經(jīng)添加了注釋,理解起來應該沒問題,如果有我注釋的不清楚的地方可以在評論區(qū)提出來,我們一起探討學習:

""" Author:XiaoMa date:2021/10/22 """ #調(diào)用所需的包 import matplotlib.pyplot as plt import cv2 import numpy as np#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像 height = img1.shape[0] #shape[0] 圖像第一維度,高度 width = img1.shape[1] #shape[1] 圖像第二維度,寬度 print(img1.shape) print(width, height) cv2.namedWindow("W0") cv2.imshow("W0", img2) cv2.waitKey(delay = 0)#創(chuàng)建和原始圖像同等大小的矩陣 img3 = np.zeros((width, height, 3), np.uint(8)) img4 = np.zeros((width, height, 3), np.uint(8)) img5 = np.zeros((width, height, 3), np.uint(8)) img6 = np.zeros((width, height, 3), np.uint(8)) img7 = np.zeros((width, height, 3), np.uint(8))#對原始圖像矩陣的值進行操作 img3 = np.uint8(img2/4) * 4 img4 = np.uint8(img2/16) * 16 img5 = np.uint8(img2/32) * 32 img6 = np.uint8(img2/64) * 64 img7 = np.uint8(img2 >= 128) * 128plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體 plt.rcParams['axes.unicode_minus'] = False #正常表示負號#顯示得到的圖像 title = ['原始圖像', '量化為64份', '量化為16份', '量化為8份', '量化為4份', '量化為2份'] #子圖標題 img = [img2, img3, img4, img5, img6, img7] for i in range(6):plt.subplot(2, 3, i + 1) #python 列表從0開始計數(shù),所以此處 i+1 plt.imshow(img[i], 'gray')plt.title(title[i])plt.xticks([]),plt.yticks([]) plt.savefig('E:\From Zhihu\For the desk\ZHM1.jpeg') plt.show()

然后得到的量化后的圖像如下:

(2)采樣操作

具體代碼如下:

""" Author:XiaoMa date:2021/10/22 """ #調(diào)用所需的包 import matplotlib.pyplot as plt import cv2 import numpy as np#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像height = img1.shape[0] #shape[0] 圖像第一維度,高度 width = img1.shape[1] #shape[1] 圖像第二維度,寬度 print(img1.shape) print(width, height) cv2.namedWindow("W0") cv2.imshow("W0", img1) cv2.waitKey(delay = 0)plt.rcParams['font.family'] = 'SimHei' #將全局中文字體改為黑體img8 = img2[0:-1:2, 0:-1:2] #img8_1 = cv2.resize(img8, dsize = None, fx = 2, fy = 2) #這個注釋先不管,后面解釋 img9 = img2[0:-1:4, 0:-1:4] #img9_1 = cv2.resize(img9, dsize = None, fx = 4, fy = 4) img10 = img2[0:-1:8, 0:-1:8] #img10_1 = cv2.resize(img10, dsize = None, fx = 8, fy = 8) img11 = img2[0:-1:16, 0:-1:16] #img11_1 = cv2.resize(img11, dsize = None, fx = 16, fy = 16) titles = ['原始圖像', '256*256', '128*128', '64*64', '32*32', '16*16'] image = [img1, img2, img8, img9, img10, img11] #此處一定要注意不加引號,別問我為什么知道,心累for j in range(6):plt.subplot(2, 3, j + 1)if j == 0:plt.imshow(image[j])else:plt.imshow(image[j], 'gray')plt.title(titles[j])plt.xticks([]), plt.yticks([]) plt.savefig('E:\From Zhihu\For the desk\ZHM2.jpeg') plt.show()

得到的圖像如上,但是第一幅圖是不是很怪?其實原因在前面講過的:

OpenCV 對于圖像的處理方式是 BGR 的,而對于 matplotlib 來說是 RGB 的,所以要將通道順序進行修改:

?只要加上這一句代碼就可以了,添加的位置是在組成列表之前就行

img_rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

關(guān)于前面的代碼中的注釋部分:圖像經(jīng)過采樣之后尺寸大小發(fā)生變化,對其尺寸進行調(diào)整使其能夠正常顯示(當然這只會在單獨顯示圖像時用到)

如:未改變尺寸前的 16*16 圖像如下(在原圖左上角)


?經(jīng)過改變后的圖像如下:

2. 圖像金字塔

(1)基本概念

概念這方面參考的文章:OpenCV(23)---圖像金字塔

? ? ? ? 圖像金字塔是由一副圖像的多個不同分辨率的子圖所構(gòu)成的圖像集合。該組圖像是由單個圖像通過不斷地降低采樣所產(chǎn)生的,最小的圖像可能僅僅只有一個像素點。如下圖所示,分辨率從低到高,逐漸降低的圖像集合。(該段全部摘自上面的文章)

? ? ? ?下面說說我的理解:在圖像的采樣的介紹中我們得到了五張經(jīng)過采樣后的圖像,而它們的分辨率都是不同的,?因為在采樣的過程中總會失去一些信息,圖像中失去的是像素點(這方面不理解可以參考文章頭粘貼的關(guān)于采樣的文章),然后將不同分辨率的圖像按照上圖中的金子塔從大到小排列上去,就是圖像金子塔了

?

? ? ? ?就拿上圖舉例,所謂的圖像金子塔就是將第二幅圖放在 Level0 層,將第三幅放在 Level1 層,以此類推,得到最終的圖像

(2)操作實現(xiàn)

高斯金子塔下采樣

#調(diào)用所需的包 import matplotlib.pyplot as plt import cv2#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像img12 = cv2.pyrDown(img1) #高斯濾波下采樣得到高斯金字塔 cv2.namedWindow("W1") cv2.imshow("W1", img12) cv2.waitKey(delay = 0)

?

將其與原圖像對比:

? ? ? ?可以看出,經(jīng)過降采樣得到的圖像與原圖像對比最主觀的變化是尺寸大小的變化,當然尺寸大小也可以通過參數(shù)進行設(shè)置,其實就是對采樣率的設(shè)置了

?拉普拉斯金子塔恢復原圖像

? ? ? ? 通過高斯金子塔下采樣得到的圖像沒辦法通過高斯上采樣恢復出來,因為按照采樣的意義來說已經(jīng)丟失了那部分的像素點,沒辦法憑空出現(xiàn),但丟失的那些信息,剛好就構(gòu)成了拉普拉斯金字塔,將高斯金字塔加進去就能復原出原圖像了

#調(diào)用所需的包 import matplotlib.pyplot as plt import cv2#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像img12 = cv2.pyrDown(img2) #高斯濾波下采樣得到高斯金字塔 cv2.namedWindow("W1") cv2.imshow("W1", img12) cv2.waitKey(delay = 0)img12_1 = img1 - cv2.pyrUp(img12) #得到拉普拉斯金字塔 cv2.namedWindow("W2") cv2.imshow("W2", img12_1) cv2.waitKey(delay = 0)img12_2 = img12_1 + cv2.pyrUp(img12) #恢復原圖像 cv2.namedWindow("W3") cv2.imshow("W3", img12_2) cv2.waitKey(delay = 0)

? ? ? ?W0 中的是原圖,W1 是經(jīng)過下采樣得到的高斯金字塔,W2 是拉普拉斯金字塔,W3 是恢復出來的原圖像

3. 局部馬賽克處理

該段參考文章:圖片處理之馬賽克

(1)實現(xiàn)原理

a:確定需要生成馬賽克的目標區(qū)域

b:將目標區(qū)域分為許多同等大小的,為了打碼效果盡可能的好,劃分的數(shù)目一般不能過多或過少

c:在劃分的區(qū)域中隨機選擇一個像素點,用這個像素點代替所有該區(qū)域中的像素點

(2)實戰(zhàn)操作

import cv2#讀取原始圖像的信息 img0 = cv2.imread('E:\From Zhihu\For the desk\ZHM.jpeg') #讀取圖像 img1 = cv2.resize(img0, fx = 0.5, fy = 0.5, dsize = None) #調(diào)整圖像大小 img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #將圖像轉(zhuǎn)化為灰度圖像height = img1.shape[0] #shape[0] 圖像第一維度,高度 width = img1.shape[1] #shape[1] 圖像第二維度,寬度 print(img1.shape) print(width, height) cv2.namedWindow("W0") cv2.imshow("W0", img1) cv2.waitKey(delay = 0)for i in range(200, 400, 10): #生產(chǎn)馬賽克的目標區(qū)域(對圖像高度)for j in range(200, 400, 10): #生成馬賽克的目標區(qū)域(對圖像寬度)for m in range(0, 10): #區(qū)域大小為 10 * 10for n in range(0, 10):img1[i+m, j+n] = img1[i, j] #用該區(qū)域的第一個像素點替換掉其他的像素點 cv2.namedWindow("W4") cv2.imshow("W4", img1) cv2.waitKey(delay = 0)

得到圖像如下:

??

結(jié)束語

? ? ? ? 本篇文章主要總結(jié)了圖像的采樣以及量化的原理以及操作,在此基礎(chǔ)上添加了圖像的馬賽克處理以及圖像金子塔,其中參考的一些文章的鏈接也添加了進去,如果需要更深入的了解和學習可以點進去學習

總結(jié)

以上是生活随笔為你收集整理的Python 计算机视觉(六)—— OpenCV 进行图像量化与采样的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。