發布時間: 2019-08-19 13:42:03
本實驗使用OpenCV圖像處理庫實現基本的圖像預處理操作。包括圖像的顏色空間轉換、坐標變化、灰度變化、直方圖變化和圖像濾波。
?
本實驗建議安裝3.6以上版本的Python環境,并且需要安裝OpenCV,numpy,matplotlib第三方庫。
4.實驗步驟
4.1.基本操作
注意:所有實驗1.4中代碼所讀取的圖片,學員可選用自己電腦本地的圖片讀??;圖片路徑為自己本地的實際路徑。
步驟 1圖像的讀取和顯示?
import cv2
# 讀取一副圖像 第一個參數是圖像路徑
# 第二個參數代表讀取方式,1表示3通道彩色,0表示單通道灰度
im = cv2.imread(r"lena512color.tiff",1)
# 在"test"窗口中顯示圖像im
cv2.imshow("test",im)
# 等待用戶按鍵反饋
cv2.waitKey()
# 銷毀所有創建的窗口
cv2.destroyAllWindows()
? 步驟 2顯示數據類型和圖像尺寸
# 打印圖像數據的數據結構類型
print(type(im))
# 打印圖像的尺寸
print(im.shape)
步驟 3圖像的保存
# 將圖像保存到指定路徑
cv2.imwrite('lena.jpg',im)
? 4.2.顏色空間轉換
步驟 1彩色圖像灰度化
import cv2
im = cv2.imread(r"lena.jpg")
cv2.imshow("BGR",im)
# 使用cvtColor進行顏色空間變化 cv2.COLOR_BGR2GRAY 代表BGR to gray
img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray",img_gray)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 2更換三通道順序BGR為RGB
import cv2
im = cv2.imread(r"lena.jpg")
cv2.imshow("BGR",im)
# 使用cvtColor進行顏色空間變化 cv2.COLOR_BGR2RGB 代表BGR to RGB
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
# 當圖像數據為3通道時,imshow函數認為數據是BGR的
# 使用imshow顯示RGB數據,會發現圖片顯示顏色畸變
cv2.imshow("RGB",im_rgb)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 3BGR和HSV顏色空間轉換
import cv2
im = cv2.imread(r"lena.jpg")
cv2.imshow("BGR",im)
# 使用cvtColor進行顏色空間變化 cv2.COLOR_BGR2HSV 代表BGR to HSV
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
# 當圖像數據為3通道時,imshow函數認為數據是BGR的
# 使用imshow顯示HSV數據,會將HSV分量強行當做BGR進行顯示
cv2.imshow("HSV",im_hsv)
cv2.waitKey()
cv2.destroyAllWindows()
4.3.坐標變化
步驟 1平移
import numpy as np
import cv2
# 定義平移translate函數
def translate(img, x, y):
# 獲取圖像尺寸
(h, w) = img.shape[:2]
# 定義平移矩陣
M = np.float32([[1, 0, x], [0, 1, y]])
# 使用OpenCV仿射變換函數實現平移操作
shifted = cv2.warpAffine(img, M, (w, h))
# 返回轉換后的圖像
return shifted
# 加載圖像并顯示
im = cv2.imread('lena.jpg')
cv2.imshow("Orig", im)
# 對原圖做平移操作
# 下移50像素
shifted = translate(im, 0, 50)
cv2.imshow("Shift1", shifted)
# 左移100像素
shifted = translate(im, -100, 0)
cv2.imshow("Shift2", shifted)
# 右移50,下移100像素
shifted = translate(im, 50, 100)
cv2.imshow("Shift3", shifted)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 2旋轉
import numpy as np
import cv2
# 定義旋轉rotate函數
def rotate(img, angle, center=None, scale=1.0):
# 獲取圖像尺寸
(h, w) = img.shape[:2]
# 旋轉中心的缺失值為圖像中心
if center is None:
center = (w / 2, h / 2)
# 調用計算旋轉矩陣函數
M = cv2.getRotationMatrix2D(center, angle, scale)
# 使用OpenCV仿射變換函數實現旋轉操作
rotated = cv2.warpAffine(img, M, (w, h))
# 返回旋轉后的圖像
return rotated
im = cv2.imread('lena.jpg')
cv2.imshow("Orig", im)
# 對原圖做旋轉操作
# 逆時針45度
rotated = rotate(im, 45)
cv2.imshow("Rotate1", rotated)
# 順時針20度
rotated = rotate(im, -20)
cv2.imshow("Rotate2", rotated)
# 逆時針90度
rotated = rotate(im, 90)
cv2.imshow("Rotate3", rotated)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 3鏡像
import numpy as np
import cv2
im = cv2.imread('lena.jpg')
cv2.imshow("orig", im)
# 進行水平鏡像
im_flip0 = cv2.flip(im, 0)
cv2.imshow("flip vertical ", im_flip0)
# 進行垂直鏡像
im_flip1 = cv2.flip(im, 1)
cv2.imshow("flip horizontal ", im_flip1)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 4縮放
import numpy as np
import cv2
im = cv2.imread('lena.jpg')
cv2.imshow("orig", im)
# 獲取圖像尺寸
(h, w) = im.shape[:2]
# 縮放的目標尺寸
dst_size = (200,300)
# 最鄰近插值
method = cv2.INTER_NEAREST
# 進行縮放
resized = cv2.resize(im, dst_size, interpolation = method)
cv2.imshow("resized1", resized)
# 縮放的目標尺寸
dst_size = (800,600)
# 雙線性插值
method = cv2.INTER_LINEAR
# 進行縮放
resized = cv2.resize(im, dst_size, interpolation = method)
cv2.imshow("resized2", resized)
cv2.waitKey()
cv2.destroyAllWindows()
4.4.灰度變化
步驟 1灰度變化。反轉,灰度拉伸,灰度壓縮
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 定義線性灰度變化函數
# k>1時 實現灰度數值的拉伸
# 0<k<1時 實現灰度數值的壓縮
# k=-1 b=255 實現灰度反轉
def linear_trans(img, k, b=0):
# 計算灰度線性變化的映射表
trans_list = [(np.float32(x)*k+b) for x in range(256)]
# 將列表轉換為np.array
trans_table =np.array(trans_list)
# 將超過[0,255]灰度范圍的數值進行調整,并指定數據類型為uint8
trans_table[trans_table>255] = 255
trans_table[trans_table<0] = 0
trans_table = np.round(trans_table).astype(np.uint8)
# 使用OpenCV的look up table函數修改圖像的灰度值
return cv2.LUT(img, trans_table)
im = cv2.imread('lena.jpg',0)
cv2.imshow('org', im)
# 反轉
im_inversion = linear_trans(im, -1, 255)
cv2.imshow('inversion', im_inversion)
# 灰度拉伸
im_stretch = linear_trans(im, 1.2)
cv2.imshow('graystretch', im_stretch)
# 灰度壓縮
im_compress = linear_trans(im, 0.8)
cv2.imshow('graycompress', im_compress)
cv2.waitKey()
cv2.destroyAllWindows()
步驟 2伽馬變化
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 定義伽馬變化函數
def gamma_trans(img, gamma):
# 先歸一化到1,做伽馬計算,再還原到[0,255]
gamma_list = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
# 將列表轉換為np.array,并指定數據類型為uint8
gamma_table = np.round(np.array(gamma_list)).astype(np.uint8)
# 使用OpenCV的look up table函數修改圖像的灰度值
return cv2.LUT(img, gamma_table)
im = cv2.imread('lena.jpg',0)
cv2.imshow('org', im)
# 使用伽馬值為0.5的變化,實現對暗部的拉升,亮部的壓縮
im_gama05 = gamma_trans(im, 0.5)
cv2.imshow('gama0.5', im_gama05)
# 使用伽馬值為2的變化,實現對亮部的拉升,暗部的壓縮
im_gama2 = gamma_trans(im, 2)
cv2.imshow('gama2', im_gama2)
cv2.waitKey()
cv2.destroyAllWindows()
4.5.直方圖
步驟 1直方圖的顯示
import cv2
from matplotlib import pyplot as plt
# 讀取并顯示圖像
im = cv2.imread("lena.jpg",0)
cv2.imshow('org', im)
# 繪制灰度圖像的直方圖
plt.hist(im.ravel(), 256, [0,256])
plt.show()
# 等待用戶按鍵反饋
cv2.waitKey()
cv2.destroyAllWindows()
步驟 2直方圖均衡化
import cv2
from matplotlib import pyplot as plt
im = cv2.imread("lena.jpg",0)
cv2.imshow('org', im)
# 調用OpenCV的直方圖均衡化API
im_equ1 = cv2.equalizeHist(im)
cv2.imshow('equal', im_equ1)
# 顯示原始圖像的直方圖
plt.subplot(2,1,1)
plt.hist(im.ravel(), 256, [0,256],label='org')
plt.legend()
# 顯示均衡化圖像的直方圖
plt.subplot(2,1,2)
plt.hist(im_equ1.ravel(), 256, [0,256],label='equalize')
plt.legend()
plt.show()
# 等待用戶按鍵反饋后銷毀窗口
cv2.waitKey()
cv2.destroyAllWindows()
4.6.濾波
步驟 1中值濾波
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 調用OpenCV的中值模糊API
im_medianblur = cv2.medianBlur(im, 5)
cv2.imshow('median_blur',im_medianblur)
cv2.waitKey(0)
cv2.destroyAllWindows()
步驟 2均值濾波
# 方法一:直接調用OpenCV的API
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 調用OpenCV的均值模糊API
im_meanblur1 = cv2.blur(im, (3, 3))
cv2.imshow('mean_blur_1',im_meanblur1)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方法二:使用均值算子和filter2D 自定義濾波操作
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 均值算子
mean_blur = np.ones([3, 3], np.float32)/9
# 使用filter2D進行濾波操作
im_meanblur2 = cv2.filter2D(im,-1,mean_blur)
cv2.imshow('mean_blur_2',im_meanblur2)
cv2.waitKey(0)
cv2.destroyAllWindows()
步驟 3高斯濾波
# 方法一:直接調用OpenCV的API
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 調用OpenCV的高斯模糊API
im_gaussianblur1 = cv2.GaussianBlur(im, (5, 5), 0)
cv2.imshow('gaussian_blur_1',im_gaussianblur1)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方法二:使用高斯算子和filter2D 自定義濾波操作
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 高斯算子
gaussian_blur = np.array([
[1,4,7,4,1],
[4,16,26,16,4],
[7,26,41,26,7],
[4,16,26,16,4],
[1,4,7,4,1]], np.float32)/273
# 使用filter2D進行濾波操作
im_gaussianblur2 = cv2.filter2D(im,-1,gaussian_blur)
cv2.imshow('gaussian_blur_2',im_gaussianblur2)
cv2.waitKey(0)
cv2.destroyAllWindows()
步驟 4銳化
import cv2
import numpy as np
im = cv2.imread('lena.jpg')
cv2.imshow('org',im)
# 銳化算子
sharpen_1 = np.array([
[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])
# 使用filter2D進行濾波操作
im_sharpen1 = cv2.filter2D(im,-1,sharpen_1)
cv2.imshow('sharpen_1',im_sharpen1)
# 銳化算子2
sharpen_2 = np.array([
[0,-1,0],
[-1,8,-1],
[0,1,0]])/4.0
# 使用filter2D進行濾波操作
im_sharpen2 = cv2.filter2D(im,-1,sharpen_2)
cv2.imshow('sharpen_2',im_sharpen2)
cv2.waitKey(0)
cv2.destroyAllWindows()
? 5.實驗小結
本章主要介紹了應用基于Python語言的OpenCV圖像處理庫進行圖像預處理實驗的具體操作。使用OpenCV圖像處理庫實現了圖像的顏色空間轉換、坐標變化、灰度變化、直方圖變化和圖像濾波。加深對圖像預處理技術的感知,為使用圖像預處理技術提供了實際的操作指導。
上一篇: 大數據培訓_為什么Spark比MapReduce快100X
下一篇: H5培訓_H5導航制作