1. 程式人生 > >python進階—OpenCV之影象處理(二)

python進階—OpenCV之影象處理(二)

文章目錄


本篇續接OpenCV影象處理部分。到現在為止已經2個多月了,才寫到opencv教程的第3部分,任重道遠。

影象形態變換

影象的形態轉換主要是基於二值化影象,進行影象的形狀操作。形態變換操作需要2個輸入;一個是二值化影象,另外一個被稱為“結構化元素”;主要的形態轉換操作是複試與膨脹,其它形態轉換操作都基於此兩者操作。

影象的腐蝕

對輸入影象用特定結構元素進行腐蝕操作,表現出的現象是影象被縮小;此處的縮小不是指影象的尺寸變小,而是影象中的資訊部分(主要是亮度較高的畫素)縮小。
腐蝕演算法:用結構元素對應的矩陣,例如3X3,掃描影象的每一個畫素,用結構元素與其覆蓋的影象做“與”運算,如果都為1,結構影象的該畫素為1,否則為0;結果:使影象減小一圈。

  • 函式原型:dst = cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
  • src:輸入始影象,通道數不限,depth必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F
  • dst:輸出影象:size與type與原始影象相同
  • kernel:用於腐蝕操作的結構元素,如果取值為Mat(),那麼預設使用一個3 x 3 的方形結構元素,可以使用getStructuringElement來建立結構元素
  • anchor:卷積核的基準點(anchor),其預設值為(-1,-1)表示位於kernel中心位置。基準點即選取的kernel中心位置與進行處理畫素重合的點。
  • iterations:腐蝕操作被遞迴執行的次數
  • borderType:影象邊界模式
  • borderValue:邊界值,預設值是BORDER_DEFAULT
import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)

在這裡插入圖片描述在這裡插入圖片描述

影象的膨脹

對輸入影象用特定結構元素進行膨脹操作,表現出的現象是影象被放大;此處的放大不是指影象的尺寸變大,而是影象中的資訊部分(主要是亮度較高的畫素)放大。
膨脹演算法:用結構元素對應的矩陣,例如3X3,掃描影象的每一個畫素,用結構元素與其覆蓋的影象做“或”運算,如果都為0,結構影象的該畫素為0,否則為1;結果:使影象放大一圈。

  • 函式原型:dst = cv.dilate( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
  • src:輸入始影象,通道數不限,depth必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F
  • dst:輸出影象:size與type與原始影象相同
  • kernel:用於腐蝕操作的結構元素,如果取值為Mat(),那麼預設使用一個3 x 3 的方形結構元素,可以使用getStructuringElement來建立結構元素
  • anchor:卷積核的基準點(anchor),其預設值為(-1,-1)表示位於kernel中心位置。基準點即選取的kernel中心位置與進行處理畫素重合的點。
  • iterations:腐蝕操作被遞迴執行的次數
  • borderType:影象邊界模式
  • borderValue:邊界值,預設值是BORDER_DEFAULT
import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv.dilate(img,kernel,iterations = 1)

在這裡插入圖片描述

影象的開操作

影象的開操作是指,先腐蝕後膨脹,適合去除影象有效資訊外的白噪點

  • 函式原型:dst = cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • src:輸入始影象,通道數不限,depth必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F
  • dst:輸出影象:size與type與原始影象相同
  • op:形態學運算的型別,主要有
    cv.MORPH_OPEN: 開運算
    cv.MORPH_CLOSE :閉運算
    cv.MORPH_GRADIENT: 形態學梯度
    cv.MORPH_TOPHAT:頂帽運算
    cv.MORPH_BLACKHAT: 黑帽運算
    cv.MORPH_ERODE :腐蝕運算
    cv.MORPH_DILATE :膨脹運算
    cv.MORPH_HITMISS: 擊中擊不中運算(只支援CV_8UC1型別的二值影象)
  • kernel:用於腐蝕操作的結構元素,如果取值為Mat(),那麼預設使用一個3 x 3 的方形結構元素,可以使用getStructuringElement來建立結構元素
  • anchor:卷積核的基準點(anchor),其預設值為(-1,-1)表示位於kernel中心位置。基準點即選取的kernel中心位置與進行處理畫素重合的點。
  • iterations:腐蝕操作被遞迴執行的次數
  • borderType:影象邊界模式
  • borderValue:邊界值,預設值是BORDER_DEFAULT
import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

在這裡插入圖片描述

影象的閉操作

影象的閉操作是指,先膨脹後腐蝕,適合去除影象有效資訊內的黑噪點
函式與開操作函式相同,只是op引數不同,取值為:cv.MORPH_CLOSE

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)

在這裡插入圖片描述

影象的形態學梯度

形態學梯度:膨脹圖減去腐蝕圖,dilation - erosion,這樣會得到物體的輪廓
函式與開操作函式相同,只是op引數不同,取值為:cv.MORPH_GRADIENT

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

在這裡插入圖片描述

影象的頂帽操作

頂帽(tophat):原圖減去開操作後的圖:src - open_dst
因為開操作帶來的結果是放大了裂縫或者區域性低亮度的區域,因此,從原圖中減去開運算後的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。
頂帽運算往往用來分離比鄰近點亮一些的斑塊。當一幅影象具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。
函式與開操作函式相同,只是op引數不同,取值為:cv.MORPH_TOPHAT

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)

在這裡插入圖片描述

影象的黑帽操作

黑帽(blackhat):閉運算影象與原影象差值:close_dst - src
黑帽運算後的效果圖突出了比原圖輪廓周圍的區域更暗的區域,且這一操作和選擇的核的大小相關。所以,黑帽運算用來分離比鄰近點暗一些的斑塊,顯示出影象的輪廓。
函式與開操作函式相同,只是op引數不同,取值為:cv.MORPH_BLACKHAT

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

在這裡插入圖片描述

影象的梯度(Image Gradients)

opencv提供了三種梯度過濾器或高通過濾器Sobel、Scharr、Laplacian.(高通濾波器high-pass fliter(HPF) 尋找圖片的邊界)。
影象上的高通濾波器怎麼理解,暫時不得而知,

Sobel and Scharr (索貝爾)運算元

Sobel operators是高斯模糊操作 加上differentian(變異/分化);所以它對噪音更有抵抗;可以指明衍生物(derivatives)的方向,垂直或者是水平的(分別對應是yorder、xorder)。
在引數ksize中指明kernel 的大小。其中ksize=-1時,會使用3x3的Charr filter(在這個情況下,結果會更好)
Sobel運算元是一階導數的邊緣檢測運算元,在演算法實現過程中,通過3×3模板作為核與影象中的每個畫素點做卷積和運算,然後選取合適的閾值以提取邊緣。
採用3×3鄰域可以避免在畫素之間內插點上計算梯度。Sobel運算元也是一種梯度幅值。
Sobel運算元演算法的優點是計算簡單,速度快。但是由於只採用了2個方向的模板,只能檢測水平和垂直方向的邊緣,因此這種演算法對於紋理較為複雜的影象,其邊緣檢測效果就不是很理想。
該演算法認為:凡灰度新值大於或等於閾值的畫素點時都是邊緣點。這種判斷欠合理,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大。
scharr運算元與Sobel的不同點是在平滑部分,這裡所用的平滑運算元是1/16∗[3,10,3],相比於1/4∗[1,2,1],中心元素佔的權重更重,這可能是相對於影象這種隨機性較強的訊號,鄰域相關性不大,所以鄰域平滑應該使用相對較小的標準差的高斯函式,也就是更瘦高的模板

  • 函式原型:dst = cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
  • src:輸入影象
  • dst:輸出影象size大小與channel數量與原始影象相同
  • ddepth:輸出影象的畫素深度,組合如下
輸入影象 輸出影象
CV_8U -1/CV_16S/CV_32F/CV_64F
CV_16U、CV_16S -1/CV_32F/CV_64F
CV_32F -1/CV_32F/CV_64F
CV_64F -1/CV_64F
  • dx: x 方向上的差分階數
  • dy: y 方向上的差分階數
  • ksize:Sobel kernel大小,必須是:1, 3, 5, or 7。
  • scale:可選的導數比例因子,預設未使用
  • delta:可選的delta值,輸出結果前疊加到結果上
  • borderType:影象邊界模式

  • 函式原型:dst = cv.Scharr( src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]] )
  • src:輸入影象
  • dst:輸出影象size大小與channel數量與原始影象相同
  • ddepth:輸出影象的畫素深度。
  • dx: x 方向上的差分階數
  • dy: y 方向上的差分階數
  • ksize:Sobel kernel大小,必須是:1, 3, 5, or 7。
  • scale:可選的導數比例因子,預設未使用
  • delta:可選的delta值,輸出結果前疊加到結果上
  • borderType:影象邊界模式
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('dave.jpg',0)
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize=5)
sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

原圖見拉普拉斯運算元原圖
在這裡插入圖片描述
注意:

  • 當輸出的值為cv2.CV_8U或者是np.uint8時;Black- to -White transition 是positive slope(正數);反過來White- to - Black transition取negative slope(負數)。所以當輸出時轉化資料為unit8時,所有的negative slope 都會被置為0,這種情況都會丟失了一部分的邊緣。
  • 更好的處理方式是,讓輸出的資料型別儲存到更高的形式,例如cv2.CV_16S,cv2.CV_64F等。取它的絕對值,然後再把值轉化回cv2.CV_8U。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('box.png',0)
# Output dtype = cv.CV_8U
sobelx8u = cv.Sobel(img,cv.CV_8U,1,0,ksize=5)
# Output dtype = cv.CV_64F. Then take its absolute and convert to cv.CV_8U
sobelx64f = cv.Sobel(img,cv.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()

在這裡插入圖片描述

Laplacian (拉普拉斯)運算元

Laplacian 運算元是n維歐幾里德空間中的一個二階微分運算元,定義為梯度grad的散度div。
這裡不甚明白,還需要多加學習與練習,先看效果吧

  • 函式原型:dst=cv.Laplacian( src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]] )
  • src:輸入影象
  • dst:輸出影象size大小與channel數量與原始影象相同
  • ddepth:期望輸出影象的畫素深度
  • dx: x 方向上的差分階數
  • dy: y 方向上的差分階數
  • ksize:Sobel kernel大小,必須是:1, 3, 5, or 7。
  • scale:可選的導數比例因子,預設未使用
  • delta:可選的delta值,輸出結果前疊加到結果上
  • borderType:影象邊界模式
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('dave.jpg',0)
laplacian = cv.Laplacian(img,cv.CV_64F)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.show()

在這裡插入圖片描述

canny邊緣檢測

  1. 應用高斯濾波來平滑影象,目的是去除噪聲
  2. 用一階偏導有限差分計算梯度幅值和方向,找尋影象的強度梯度(intensity gradients)
  3. 應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是)
  4. 應用雙閾值的方法來決定可能的(潛在的)邊界
  5. 利用滯後技術來跟蹤邊界
    複雜的演算法原理我描述不出來,只能上程式碼看效果
  • 函式原型:edges=cv.Canny( image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]] )
  • image:8-bit input image.
  • edges:單通道儲存邊緣的輸出影象,size大小與輸入影象相同
  • threshold1:滯後處理的第一個閾值,(低閾值)
  • threshold2:滯後處理的第一個閾值,(高閾值)
  • apertureSize:運算元核心大小(濾波計算矩陣的大小預設為3)可以是1、3、5、7
  • L2gradient :標誌位,用於指示是否使用更準確的梯度計算方法,引數為true時會增加計算量
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

在這裡插入圖片描述

影象金字塔(Image Pyramids)

影象金字塔有兩種:高斯金字塔、拉普拉斯金字塔

  • 高斯金字塔:向下降取樣,影象每級縮小一半。金字塔從i層生成第i+1層(i從0開始),我們要先用高斯核對Gi進行卷積,然後,刪除所有偶數行和偶數列。這樣,新得到的影象面積會變為源影象的四分之一。迴圈上述過程,即可產生整個金字塔。
  • 拉普拉斯金字塔:從頂層影象中向上取樣重建影象,每一級影象放大一倍。影象首先在每個維度上擴大為原來的兩倍,新增的行以0填充,然後給指定的濾波器進行卷積(實際上是一個在每一維上都擴大為2倍的過濾器)去估計“丟失”畫素的近似值。得到後的影象與原來的影象相比較會發覺比較模糊,丟失了一些資訊。為了恢復出原來的影象,我們需要獲得這些丟失的資訊,這些資訊就構成了拉普拉斯金字塔。

高斯金字塔函式說明:

  • 函式原型:dst = cv.pyrUp( src[, dst[, dstsize[, borderType]]] )
  • src:輸入圖影象
  • dst:輸出影象,影象的size為dstsize指定,type保持與src相同
  • dstsize:輸出影象大小
  • borderType:邊界模式,僅支援BORDER_DEFAULT
img = cv.imread('messi5.jpg')
lower_reso1 = cv.pyrDown(img)
lower_reso2 = cv.pyrDown(lower_reso1)
lower_reso3 = cv.pyrDown(lower_reso2)

在這裡插入圖片描述


拉普拉斯金字塔函式說明:

  • 函式原型:dst = cv.pyrDown( src[, dst[, dstsize[, borderType]]] )
  • src:輸入圖影象
  • dst:輸出影象,影象的size為dstsize指定,type保持與src相同
  • dstsize:輸出影象大小
  • borderType:邊界模式,BORDER_CONSTANT不支援
img = cv.imread('messi5.jpg')
lower_reso = cv.pyrDown(higher_reso)
higher_reso2 = cv.pyrUp(lower_reso)

在這裡插入圖片描述

影象的輪廓(Contours in opencv)

如何找到影象輪廓

cv.findContours()函式可以查詢影象的輪廓

  • 函式原型:image, contours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] )
  • image:單通道二值影象,一般是經過Canny、拉普拉斯等邊緣檢測運算元處理過的二值影象
  • contours:檢測到的輪廓集,每一個輪廓由一個vector儲存的連續點組成。定義為“vector<vector> contours”,是一個向量,並且是一個雙重向量,向量內每個元素儲存了一組由連續的Point點構成的點的集合的向量,每一組Point點集就是一個輪廓;有多少輪廓,向量contours就有多少元素
  • hierarchy:是一個向量,向量內每個元素儲存了一個包含4個int整型的陣列。向量hiararchy內的元素和輪廓向量contours內的元素是一一對應的,向量的容量相同。hierarchy向量內每一個元素的4個int型變數——hierarchy[i][0] ~hierarchy[i][3],分別表示第 i個輪廓的後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號。如果當前輪廓沒有對應的後一個
    輪廓、前一個輪廓、父輪廓或內嵌輪廓的話,則hierarchy[i][0] ~hierarchy[i][3]的相應位被設定為預設值-1
  • mode:輪廓的檢索模式,
    CV_RETR_EXTERNAL:只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略
    CV_RETR_LIST:檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不建立等級關係,彼此之間獨立,沒有等級關係,這就意味著這個檢索模式下不存在父輪廓或內嵌輪廓,所以hierarchy向量內所有元素的第3、第4個分量都會被置為-1
    CV_RETR_CCOMP:檢測所有的輪廓,但所有輪廓只建立兩個等級關係,外圍為頂層,若外圍內的內圍輪廓還包含了其他的輪廓資訊,則內圍內的所有輪廓均歸屬於頂層
    CV_RETR_TREE:檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含內層輪廓,內層輪廓還可以繼續包含內嵌輪廓
  • method:輪廓的近似方法
    CV_CHAIN_APPROX_NONE:儲存物體邊界上所有連續的輪廓點到contours向量內
    CV_CHAIN_APPROX_SIMPLE:僅儲存輪廓的拐點資訊,把所有輪廓拐點處的點儲存入contours向量內,拐點與拐點之間直線段上的資訊點不予保留
    CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近 似演算法
  • offset:偏移量,所有的輪廓資訊相對於原始影象對應點的偏移量,相當於在每一個檢測出的輪廓點上加上該偏移量,並且Point還可以是負值
import numpy as np
import cv2 as cv
im = cv.imread('test.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

cv.drawContours函式用於畫影象的輪廓

  • 函式原型:image = cv.drawContours( image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]] )
  • image:用以繪製輪廓的影象。和其他繪圖函式一樣,邊界影象被感興趣區域(ROI)所剪下
  • contours:所有輸入影象的輪廓集
  • contourIdx:指示輪廓集中的哪一個輪廓被畫出,如果是負值,則所有輪廓被畫出
  • color:輪廓顏色
  • thickness:繪製輪廓線的寬度。如果為負值(例如,等於CV_FILLED),則contour內部將被繪製
  • lineType:輪廓線段的型別,具體檢視cvLine的描述
  • hierarchy:可選的輪廓層次資訊,如果只想畫某些層次的輪廓,才需要此引數。
  • maxLevel:繪製輪廓的最大等級。如果等級為0,繪製單獨的輪廓。如果為1,繪製輪廓及在其後的相同的級別下輪廓。如果值為2,所有的輪廓。如果等級為2,繪製所有同級輪廓及所有低一級輪廓,諸此種種。如果值為負數,函式不繪製同級輪廓,但會升序繪製直到級別為abs(max_level)-1的子輪廓。
  • offset:按照給出的偏移量移動每一個輪廓點座標.當輪廓是從某些感興趣區域(ROI)中提取的然後需要在運算中考慮ROI偏移量時,將會用到這個引數。
    在這裡插入圖片描述

輪廓的特點

  1. 輪廓矩Moments
    opencv中的矩主要包括以下幾種:空間矩,中心矩和中心歸一化矩。從影象中計算出來的矩通常描述了影象不同種類的幾何特徵如:大小、灰度、方向、形狀等,影象矩廣泛應用於模式識別、目標分類、目標識別與防偽估計、影象編碼與重構等領域。
import numpy as np
import cv2 as cv
img = cv.imread('star.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv.moments(cnt)
print( M )
  1. 輪廓面積Contour Area
area = cv.contourArea(cnt)
  1. 輪廓周長Contour Perimeter
perimeter = cv.arcLength(cnt,True)
  1. 輪廓近似圖Contour Approximation
epsilon = 0.1*cv.arcLength(cnt,True)
approx = cv.approxPolyDP(cnt,epsilon,True)
  1. 輪廓凸包Convex Hull
hull = cv.convexHull(points[, hull[, clockwise[, returnPoints]]
  1. 輪廓凸包檢查Checking Convexity
k = cv.isContourConvex(cnt)
  1. 輪廓矩形邊框Bounding Rectangle
x,y,w,h = cv.boundingRect(cnt)
cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
  1. 輪廓最小圓Minimum Enclosing Circle
rect = cv.minAreaRect(cnt)
box = cv.boxPoints(rect)
box = np.int0(box)
cv.drawContours(img,[box],0,(0,0,255),2)

12.輪廓最橢圓 Fitting an Ellipse

(x,y),radius = cv.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv.circle(img,center,radius,(0,255,0),2)
  1. 輪廓直線Fitting a Line
rows,cols = img.shape[:2]
[vx,vy,x,y] = cv.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
cv.line(img,(cols
            
           

相關推薦

pythonOpenCV影象處理

文章目錄 影象形態變換 影象的腐蝕 影象的膨脹 影象的開操作 影象的閉操作 影象的形態學梯度 影象的頂帽操作 影象的黑帽操作 影象的梯度(Image Gradients) So

pythonOpenCV影象處理

文章目錄 顏色空間轉換 RGB色彩空間 HSV色彩空間 YUV色彩空間 簡單的物體跟蹤示例 HSV空間目標閾值選取 影象幾何變換 影象的縮放 影象的位移 影象的旋轉 影

pythonOpenCV常用影象操作函式說明

文章目錄 cv2.threshold cv2.bitwise_and cv2.bitwise_or cv2.bitwise_not cv2.inRange cv2.resize cv2.adaptiveThreshold cv2

Python——OpenCVCore Operations

文章目錄 影象基本操作 訪問並修改畫素值 訪問影象的屬性 設定影象區域 影象分割與合併 畫影象邊框 影象的數學操作 影象疊加 影象融合 影象位操作 Python

Python——OpenCVGUI

文章目錄 影象處理(Getting Started with Images) 讀取影象 顯示影象 儲存影象 使用Matplotlib 視訊處理(Getting Started with Videos)

OpenCV入門教程十一】 形態學影象處理:開運算、閉運算、形態學梯度、頂帽、黑帽合輯

上篇文章中,我們重點了解了腐蝕和膨脹這兩種最基本的形態學操作,而運用這兩個基本操作,我們可以實現更高階的形態學變換。所以,本文的主角是OpenCV中的morphologyEx函式,它利用基本的膨脹和腐蝕技術,來執行更加高階的形態學變換,如開閉運算、形態學梯度、“頂帽”、“黑帽

OpenCV-Python 影象處理影象的讀取、顯示與儲存

說明: 本系列主要是學習OpenCV-Python文件的個人筆記。 很少有理論的敘述,都是函式名、引數描述、作用、應用場景、程式碼、效果圖。簡單明瞭,即學即用。 目標 學會讀取、顯示、儲存單張影象 對應的函式分佈為:cv2.imread() ,

opencv影象處理:濾波器

     濾波器在影象處理中的應用非常廣泛,OpenCV也有個直接使用濾波器掩碼(核)的函式filter2D,將影象與核進行卷積運算得到目標影象。卷積是在每一個影象塊與某個運算元(核)之間進行的運算,而核就是一個固定大小的數值陣列。     &n

【小白的Struts2系列1】---Struts2框架簡介

首先在此之前應該解決幾個問題: 什麼是框架?(Framework) 框架可以類比於建築中的房樑,可以說它是一個框子(指其約束性),也能說它是一個架子(指其支撐性) 約束性:針對解決特定的問題的軟體框架會首先定義問題的邊界,進而將相關的軟體組織約束在這個邊界內,保持框架在解決

OpenCV數字影象處理——直方圖均衡化的實現

計算一幅影象的直方圖 影象是由不同數值的顏色畫素組成,畫素值在整幅影象中的分佈情況是該影象的一個重要屬性。直方圖(Histogram)是一幅影象分佈的精確圖形表示。因此,灰度影象的直方圖有256個專案。 OpenCV計算直方圖 環境:Windows 10,

Android2 陰影製作Shadow

dx:X軸方向的偏移量dy:Y軸方向的偏移量color:陰影顏色注意:如果半徑被設定為0,意思就是去掉陰影。具體實現:package xiaosi.textShadow;import android.app.Activity;import android.content.Context;import andr

Python——pygame影象處理

上接: Python——pygame影象處理(一) 4. 一直移到最右邊: import pygame,sys pygame.init() screen = pygame.display.set_mode([640,480]) screen.fill([255

vue.js元件——元件通訊3

(1)概述 所謂元件間的通訊,實際上就是指在各個元件間,進行引數或者資訊的相互傳遞。比如我們前面學的通過props給子元件傳參,實際上這就是父元件向子元件進行單向的通訊。 (2)元件間通訊的幾種方式 1.父到子的通訊 父到子的通訊使用我們前面使用的props即可

OpenCV嵌入式影象處理第一個OpenCV程式

在裝完了OpenCV和CUDA之後很自然的事情就是先跑個程式看看庫函式是否安裝完畢。對於在Windows下習慣用Visual Studio的同志們來說,可能很多人還不知道可以不用IDE程式設計(至少我當年轉Linux的時候就在想,用記事本寫程式,那工程檔案去哪了

影象處理opencv處理影象值化,灰度化等

這裡主要實現的 opencv 基於 android 對影象進行常用處理,比如說灰度化,二值化,rgb的轉換,這裡就不貼主要程式碼,只是工具程式碼。 Utils.xxx方法的使用需要在MainActivity.class中新增此方法(好像是掉用opencv,an

執行緒:多工處理17——Java中的鎖Unsafe基礎

1. 概述 本專題在之前的文章中詳細介紹了Java中最常使用的一種鎖機制——同步鎖。但是同步鎖肯定是不適合在所有應用場景中使用的。所以從本文開始,筆者將試圖通過兩到三篇文章的篇幅向讀者介紹Java中鎖的分類、原理和底層實現。以便大家在實際工作中根據應用場景進行

python-教程-多個字典對映的合併

0.摘要 當我們處理多個字典(或稱為對映,因為字典是Python中唯一的對映結構),可以通過將多個字典合併為一個字典的方式實現批量處理。   1.ChainMap類 a = {'x': 1, 'z': 3 } b = {'y':

python PIL 影象處理

第 1 章 基本的影象操作和處理 本章講解操作和處理影象的基礎知識,將通過大量示例介紹處理影象所需的 Python 工具包,並介紹用於讀取影象、影象轉換和縮放、計算導數、畫圖和儲存結果等的基本工具。這些工具的使用將貫穿本書的剩餘章節。 1.1 PIL:Py

OPENCV影象處理:模糊

模糊是基本的影象處理方法。 在介紹這兩種方法之前先來介紹兩種常見的噪聲: 椒鹽噪聲 椒鹽噪聲是由影象感測器,傳輸通道,解碼處理等產生的黑白相間的亮暗點噪聲。椒鹽噪聲分為兩種即胡椒噪聲和鹽噪聲,胡椒噪聲是黑色的,屬於低灰度噪聲,鹽噪聲是白色的,屬於高灰度噪

OpenCV嵌入式影象處理使用Jetpack安裝OpenCV4Tegra

前文記述瞭如何使用下載好的deb包在Jetson tk1上安裝CUDA和OpenCV的方法。但是目前NVIDIA官網已經不提供單獨的CUDA和OpenCV4Tegra的下載包,所有的下載、安裝工作都整合到了Jetpack安裝檔案中去。這就意味著如果你想安裝最新的