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

歡迎訪問 生活随笔!

生活随笔

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

python

基于Visual studio+Opencv+Python的透视变换、图像处理(灰度化、二值化、Canny边缘检测)模型——以2015数学建模A题太阳影子定位为例

發布時間:2023/12/10 python 25 豆豆

基于Visual studio+Opencv+Python的透視變換、圖像處理(灰度化、二值化、Canny邊緣檢測)模型——以2015數學建模A題太陽影子定位為例

最近話少,較認真,閑言少敘。
2015A數學建模賽題(不完整)

如何確定視頻的拍攝地點和拍攝日期是視頻數據分析的重要方面,太陽影子定位技術就是通過分析視頻中物體的太陽影子變化,確定視頻拍攝的地點和日期的一種方法。
4.附件4為一根直桿在太陽下的影子變化的視頻,并且已通過某種方式估計出直桿的高度為2米。請建立確定視頻拍攝地點的數學模型,并應用你們的模型給出若干個可能的拍攝地點。
如果拍攝日期未知,你能否根據視頻確定出拍攝地點與日期?

問題分析

原文附件中所給的視頻格式是.avi格式,通過問題四我們可以了解到,本題解決問題關鍵在于如何從視頻中提取關鍵要素(本題,不用前三題的結論與模型這題是做不出的。有了前三題的模型解本題相當簡單,只需要將影長數據帶入模型即可。當然這是在已經從視頻提取影長信息后,才有的操作,簡而言之,本題關鍵在于如何從視頻提取需要的影長數據,這也是本文主要介紹的內容)。
視頻提取關鍵幀,即截圖,是最常見的手段之一,因為原始視頻共有40min40s左右,所以可以以2min為分割點,提取截圖,共有21張圖片,隨機可以用photoshop量尺工具量取影長,與桿長比例求解,即可得影長數據。
?????如果真的這樣做的話,本文也就不存在,截圖誰不會~~,我相信這也不是本題得初衷,先舉一個例子:


這里有兩張圖片,已知筆長15cm,那從兩張照片估算熒光筆得長度,哪一張圖片估算的準確,第二張圖片準確無疑,但是原理是什么,為什么第一張圖存在這么大的誤差?——透視畸變。
圖像畸變對圖片本身的影響
1.視頻本身存在的透視畸變使影子投影到二維圖像時出現距上的縮短
2.視頻本身存在的拍攝角度傾斜問題會使截取一幀圖像時產生梯形畸變

所涉及名詞の解釋

透視畸變&梯形畸變

透視畸變:
指圖像使用二維方法表現三維的關系時,由于小孔成像原理,兩平行線必在極遠點相交,兩平行線是用不可能相交的,圖像會出現近大遠小的現象,即發生畸變,如圖4-4-1-1所示,不能準確刻畫物體的準確特征。注意透視畸變是一種成像變形的現象,與我們平時所說的畸變產生原理不同,并不是我們平日里所說的畸變。
透視畸變在二維圖像的表現(如下圖)

梯形畸變:
以攝像機一類數字設備拍攝目標物時,由于拍攝距離、角度等因素的限制,攝像頭往往不方便垂直于地面(或被拍攝平面)獲取圖像,這樣就產生了較大的畸變,使得圖像質量下降給后續的圖像處理帶來影響,這種情況下,畸變主要包括徑向畸變和傾斜畸變兩種。
在傾斜畸變中,梯形畸變便是最常見的畸變之一。
透視變換(Perspective Transformation)
是指利用透視中心、像點、目標點三點共線的條件,按透視旋轉定律使承影面(透視面)繞跡線(透視軸)旋轉某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換,常用于圖像的校正。
Opencv(Open Source Computer Vision Library)
是一個基于BSD許可(開源)發行的跨平臺計算機視覺軟件庫,提供Python、MATLAB等語言接口,實現了圖像處理與計算機視覺等高級通用算法。
Python
是一種計算機程序設計語言。是一種面向對象的動態類型語言,可以應用于圖像處理、機器視覺等領域,是一種易讀、易維護,并且被大量用戶所歡迎的、用途廣泛的編程語言。

基于Visual studio+Opencv+Python的逆透視圖形變化處理(數學公式本文不再給出,怕過于冗長)

借助計算機輔助,在Visual studio平臺上搭建Python開發環境,運行Opencv內置函數命令,對圖像進行處理,即可得到矩陣A即透視變換矩陣,通過透視變換矩陣,借助編程,即可得到進行圖像矯正后的圖像,通過這種方法可以有效減少由于透視畸變與梯形畸變帶來的圖形處理誤差。

視頻處理

本文采用Opencv內置的函數cv2.VideoCapture(‘Appendix4.avi’)截取視頻特定幀的畫面(程序見附錄四),并保存到指定文件夾下以備圖像的處理操作。
因為附件一、二所給數據是21組,所以這里我們以2分鐘作為一個分割點,一共導出21張光影圖片。
視頻處理代碼:

import cv2 vc = cv2.VideoCapture('Appendix4.avi') # 讀入視頻文件 f = 1 i = 1 if vc.isOpened(): # 判斷是否正常打開rval, frame = vc.read() else:rval = False timeF = 25 # 視頻幀計數間隔頻率 while rval: # 循環讀取視頻幀rval, frame = vc.read()if f % timeF == 0: # 每隔timeF幀進行存儲操作cv2.imwrite('D:\PYTHON\opencv_py\py_open\py_open\ ' + str(i) + '.jpg', frame) # 存儲為圖像i = i + 1print("i:"+str(i)+',frame:'+str(f))f = f + 1cv2.waitKey(1) vc.release()

圖像預處理

透視變換圖形處理

透視變換圖形處理最重要的步驟是求出透視變化矩陣,具體計算公式在上文已經敘述,借助計算機編程算法得出透視變化矩陣:

借助Visual studio+Opencv編程(源程序見附錄五)將截取的21張光影圖片進行透視化處理并進行局部放大,結果如下圖所示:

由圖4-4-3-1可知,透視變換對處理由于圖片攝像角度不正確、存在透視畸變等缺陷而造成的一系列圖像問題,有很好的效果。
透視變換代碼

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('hyq.jpg') rows, cols = img.shape[:2] # 原圖中書本的四個角點 pts1 = np.float32([[700, 100], [2000, 100], [700, 1000], [2000, 1000]]) # 變換后分別在左上、右上、左下、右下四個點 pts2 = np.float32([[0, 0], [2000, 0], [0, 1000], [2000, 1000]]) # 生成透視變換矩陣 M = cv2.getPerspectiveTransform(pts1, pts2) # 進行透視變換 dst = cv2.warpPerspective(img, M, (1800, 1000)) plt.subplot(121), plt.imshow(img[:, :, ::-1]), plt.title('input') plt.subplot(122), plt.imshow(dst[:, :, ::-1]), plt.title('output') # img[:, :, ::-1]是將BGR轉化為RGB #cv2.imwrite('20_20.jpg', dst) cv2.namedWindow('hyq1',0) cv2.imshow("hyq1", dst) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

灰度化處理

將彩色圖像轉化成為灰度圖像的過程成為圖像的灰度化處理,其仍然反映了整幅圖像的整體和局部的色度和亮度等級的分布和特征。
根據RGB和YUV顏色空間的變化關系可建立亮度Y與R、G、B三個顏色分量的對應關系:


灰色處理代碼

import cv2 import numpy as npif __name__ == "__main__":img_path = "11_11.jpg"img = cv2.imread(img_path)#獲取圖片的寬和高width,height = img.shape[:2][::-1]#將圖片縮小便于顯示觀看img_resize = cv2.resize(img,(int(width*0.5),int(height*0.5)),interpolation=cv2.INTER_CUBIC)#cv2.namedWindow('img',0)#cv2.imshow("img",img_resize)print("img_reisze shape:{}".format(np.shape(img_resize)))#將圖片轉為灰度圖img_gray = cv2.cvtColor(img_resize,cv2.COLOR_RGB2GRAY)#cv2.namedWindow('img_gray',0)#cv2.imshow("img_gray",img_gray)cv2.imwrite('Grey_11.jpg', img_gray)print("img_gray shape:{}".format(np.shape(img_gray)))cv2.waitKey()

二值化處理

二值化是圖像分割的一種最簡單的方法,二值化可以把灰度圖像轉換成二值圖像。把大于某個臨界灰度值(閾值)的像素灰度設為灰度極大值(255),把小于這個值的像素灰度設為灰度極小值(0),從而更有利于做圖像處理判別。
二值化分為固定閾值和自適應閾值,本題采用自適應賦值方法,借助Opencv編程得到二值化圖像如下圖


二值化代碼

import cv2 as cv import numpy as np # 根據選定的方法自動尋找閾值 src = cv.imread('Grey_20.jpg') def threshold_demo(image):# 灰度圖像gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 二值圖像ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)print('threshold value %s' % ret)cv.imshow('binary', binary)# 局部閾值 def local_threshold(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# blockSize 必須是奇數,下面設為25, 比均值大10(自己設置)就設置為黑色或者白色,在10之內的設置為另一個顏色dst = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)#cv.imshow('binary', dst) cv.imwrite('Grey_20.jpg', dst) # 自適應閾值 def custom_threshold(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)h, w = gray.shape[:2]m = np.reshape(gray, [1, w*h])# 均值mean = m.sum() / (w*h)print('mean:', mean)ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)cv.imshow('binary', binary) # 手動設定閾值 def threshold_demo_1(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)print('threshold value %s' % ret)cv.imshow('binary', binary) #cv.namedWindow('input image', cv.WINDOW_AUTOSIZE) #cv.imshow('input image', src) local_threshold(src) cv.waitKey(0) cv.destroyAllWindows()

Canny邊緣檢測

Canny邊緣檢測是從不同視覺對象中提取有用的結構信息并大大減少要處理的數據量的一種技術,其邊緣檢測算法處理流程主要有包括:
1. 使用高斯濾波器,以平滑圖像,濾除噪聲
2. 計算圖像中每個像素點的梯度強度和方向。
3. 應用非極大值抑制,以消除邊緣檢測帶來的雜散響應。
4. 應用雙閾值檢測來確定真實的和潛在的邊緣。
5. 通過抑制孤立的弱邊緣最終完成邊緣檢測。
其中,閾值的選取是否得決定著圖像是否具有連續性,本文采用動態賦予閾值的方法,通過Opencv編程得到Canny邊緣檢測結果。

代碼如下

import cv2 import numpy as np def CannyThreshold(lowThreshold):detected_edges = cv2.GaussianBlur(gray,(3,3),0)detected_edges = cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize = kernel_size)dst = cv2.bitwise_and(img,img,mask = detected_edges) # just add some colours to edges from original image.cv2.imshow('canny demo',dst)cv2.imwrite('Canny_20.jpg', dst) lowThreshold = 0 max_lowThreshold = 100 ratio = 3 kernel_size = 3 img = cv2.imread('Grey_20.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.namedWindow('canny demo') cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold) CannyThreshold(0) # initialization if cv2.waitKey(0) == 27:cv2.destroyAllWindows()

模型的求解

數字圖像處理過程始終能保持圖像的再現,能夠將我們所需要測量的區域加強并突顯出來。
為便于計算與記錄,本文將處理過的21組圖像數據進行編排,生成excel表格(附錄九),將桿高與影長數據帶入問題二、三的數學模型進行求解,可得到附件四中的具體地理位置。

參考文獻:

【1】張宇.數字圖像梯形畸變校正算法研究與視頻實時校正應用[D].安徽:安徽大學,2014:4-12
【2】張宇,張春燕,陳筍.基于OpenCV的視頻圖像梯形畸變實時校正方法[D].安徽:安徽大學科學學院,2013:43-47
【3】Daetalus.OpenCV-Python教程(8、Canny邊緣檢測)[Z].@CSDN,2013.
【4】The_Matrix_.圖像透視變換原理及實現[Z].@CSDN,2018.

作者的話:

本文所用全部程序與圖片均為自制,轉載請注明出處,不勝感激。

總結

以上是生活随笔為你收集整理的基于Visual studio+Opencv+Python的透视变换、图像处理(灰度化、二值化、Canny边缘检测)模型——以2015数学建模A题太阳影子定位为例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。