Python中的圖像處理(第六章)Python圖像量化及采樣處理(1)
- 前言
- 一. Python準備
- 二. Python仿真
- 三. 小結
前言
随着人工智能研究的不斷興起,Python的應用也在不斷上升,由于Python語言的簡潔性、易讀性以及可擴充性,特别是在開源工具和深度學習方向中各種神經網絡的應用,使得Python已經成為最受歡迎的程式設計語言之一。由于完全開源,加上簡單易學、易讀、易維護、以及其可移植性、解釋性、可擴充性、可擴充性、可嵌入性:豐富的庫等等,自己在學習與工作中也時常接觸到Python,這個系列文章的話主要就是介紹一些在Python中常用一些例程進行仿真示範!
本系列文章主要參考楊秀章老師分享的代碼資源,楊老師部落格首頁是Eastmount,楊老師興趣廣泛,不愧是令人膜拜的大佬,他過成了我理想中的樣子,希望以後有機會可以向他請教學習交流。
因為自己是做圖像語音出身的,是以結合《Python中的圖像處理》,學習一下Python,OpenCV已經在Python上進行了多個版本的維護,是以相比VS,Python的環境配置相對簡單,缺什麼庫直接安裝即可。本系列文章例程都是基于Python3.8的環境下進行,是以大家在進行借鑒的時候建議最好在3.8.0版本以上進行仿真。本文繼續來對本書第六章的前5個例程進行介紹。
一. Python準備
如何确定自己安裝好了python
win+R輸入cmd進入指令行程式
點選“确定”
輸入:python,回車
看到Python相關的版本資訊,說明Python安裝成功。
二. Python仿真
(1)建立一個chapter06_01.py檔案,輸入以下代碼,圖檔也放在與.py檔案同級檔案夾下
# -*- coding: utf-8 -*-
# BY:Eastmount CSDN 2020-11-10
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('lena.png')
#擷取圖像高度和寬度
height = img.shape[0]
width = img.shape[1]
#建立一幅圖像
new_img = np.zeros((height, width, 3), np.uint8)
#圖像量化操作 量化等級為2
for i in range(height):
for j in range(width):
for k in range(3): #對應BGR三分量
if img[i, j][k] < 128:
gray = 0
else:
gray = 128
new_img[i, j][k] = np.uint8(gray)
#顯示圖像
cv2.imshow("src", img)
cv2.imshow("Quantization", new_img)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
儲存.py檔案
輸入eixt()退出python,輸入指令行進入工程檔案目錄
輸入以下指令,跑起工程
python chapter06_01.py
沒有報錯,直接彈出圖檔,運作成功!
(2)建立一個chapter06_02.py檔案,輸入以下代碼,圖檔也放在與.py檔案同級檔案夾下
# -*- coding: utf-8 -*-
# BY:Eastmount CSDN 2020-11-10
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('lena.png')
#擷取圖像高度和寬度
height = img.shape[0]
width = img.shape[1]
#建立一幅圖像
new_img1 = np.zeros((height, width, 3), np.uint8)
new_img2 = np.zeros((height, width, 3), np.uint8)
new_img3 = np.zeros((height, width, 3), np.uint8)
#圖像量化等級為2的量化處理
for i in range(height):
for j in range(width):
for k in range(3): #對應BGR三分量
if img[i, j][k] < 128:
gray = 0
else:
gray = 128
new_img1[i, j][k] = np.uint8(gray)
#圖像量化等級為4的量化處理
for i in range(height):
for j in range(width):
for k in range(3): #對應BGR三分量
if img[i, j][k] < 64:
gray = 0
elif img[i, j][k] < 128:
gray = 64
elif img[i, j][k] < 192:
gray = 128
else:
gray = 192
new_img2[i, j][k] = np.uint8(gray)
#圖像量化等級為8的量化處理
for i in range(height):
for j in range(width):
for k in range(3): #對應BGR三分量
if img[i, j][k] < 32:
gray = 0
elif img[i, j][k] < 64:
gray = 32
elif img[i, j][k] < 96:
gray = 64
elif img[i, j][k] < 128:
gray = 96
elif img[i, j][k] < 160:
gray = 128
elif img[i, j][k] < 192:
gray = 160
elif img[i, j][k] < 224:
gray = 192
else:
gray = 224
new_img3[i, j][k] = np.uint8(gray)
#用來正常顯示中文标簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖像
titles = ['(a) 原始圖像', '(b) 量化-L2', '(c) 量化-L4', '(d) 量化-L8']
images = [img, new_img1, new_img2, new_img3]
for i in range(4):
plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
儲存.py檔案輸入以下指令,跑起工程
python chapter06_02.py
沒有報錯,直接彈出圖檔,運作成功!
(3)建立一個chapter06_03.py檔案,輸入以下代碼,圖檔也放在與.py檔案同級檔案夾下
# coding: utf-8
# BY:Eastmount CSDN 2020-11-10
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('nv.png')
#圖像二維像素轉換為一維
data = img.reshape((-1,3))
data = np.float32(data)
#定義中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#設定标簽
flags = cv2.KMEANS_RANDOM_CENTERS
#K-Means聚類 聚內建4類
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)
#圖像轉換回uint8二維類型
centers = np.uint8(centers)
res = centers[labels.flatten()]
dst = res.reshape((img.shape))
#圖像轉換為RGB顯示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
#用來正常顯示中文标簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖像
titles = ['原始圖像', '聚類量化 K=4']
images = [img, dst]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
儲存.py檔案輸入以下指令,跑起工程
python chapter06_03.py
沒有報錯,直接彈出圖檔,運作成功!
(4)建立一個chapter06_04.py檔案,輸入以下代碼,圖檔也放在與.py檔案同級檔案夾下
# -*- coding: utf-8 -*-
# BY:Eastmount CSDN 2020-11-10
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('lena.png')
#擷取圖像高度和寬度
height = img.shape[0]
width = img.shape[1]
#采樣轉換成16*16區域
numHeight = int(height/16)
numWidth = int(width/16)
#建立一幅圖像
new_img = np.zeros((height, width, 3), np.uint8)
#圖像循環采樣16*16區域
for i in range(16):
#擷取Y坐标
y = i*numHeight
for j in range(16):
#擷取X坐标
x = j*numWidth
#擷取填充顔色 左上角像素點
b = img[y, x][0]
g = img[y, x][1]
r = img[y, x][2]
#循環設定小區域采樣
for n in range(numHeight):
for m in range(numWidth):
new_img[y+n, x+m][0] = np.uint8(b)
new_img[y+n, x+m][1] = np.uint8(g)
new_img[y+n, x+m][2] = np.uint8(r)
#顯示圖像
cv2.imshow("src", img)
cv2.imshow("Sampling", new_img)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
儲存.py檔案輸入以下指令,跑起工程
python chapter06_04.py
沒有報錯,直接彈出圖檔,運作成功!
(5)建立一個chapter06_05.py檔案,輸入以下代碼,圖檔也放在與.py檔案同級檔案夾下
# -*- coding: utf-8 -*-
# BY:Eastmount CSDN 2020-11-10
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('scenery.png')
#擷取圖像高度和寬度
height = img.shape[0]
width = img.shape[1]
#采樣轉換成8*8區域
numHeight = int(height/8)
numwidth = int(width/8)
#建立一幅圖像
new_img = np.zeros((height, width, 3), np.uint8)
#圖像循環采樣8*8區域
for i in range(8):
#擷取Y坐标
y = i*numHeight
for j in range(8):
#擷取X坐标
x = j*numwidth
#擷取填充顔色 左上角像素點
b = img[y, x][0]
g = img[y, x][1]
r = img[y, x][2]
#循環設定小區域采樣
for n in range(numHeight):
for m in range(numwidth):
new_img[y+n, x+m][0] = np.uint8(b)
new_img[y+n, x+m][1] = np.uint8(g)
new_img[y+n, x+m][2] = np.uint8(r)
#顯示圖像
cv2.imshow("src", img)
cv2.imshow("Sampling", new_img)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
儲存.py檔案輸入以下指令,跑起工程
python chapter06_05.py
沒有報錯,直接彈出圖檔,運作成功!
三. 小結
本文主要介紹在Python中調用OpenCV庫對圖像進行像素級的量化,K-Means聚類分析,以及循環采樣填充等操作。由于本書的介紹比較系統全面,是以會出一個系列文章進行全系列仿真實作,下一篇文章将繼續介紹第六章節的最後5例仿真執行個體,感興趣的還是建議去原書第六章深入學習了解。每天學一個Python小知識,大家一起來學習進步阿!
本系列示例主要參考楊老師GitHub源碼,安利一下位址:ImageProcessing-Python(喜歡記得給個star哈!)