-
用opencv作圖片旋轉
Continue Reading…: 用opencv作圖片旋轉可以使用 OpenCV 的 cv2.getRotationMatrix2D() 函數來生成旋轉矩陣,然後使用 cv2.warpAffine() 函數將圖像旋轉。 請注意,旋轉角度是以逆時針方向為正的。例如,如果要將圖像逆時針旋轉 90 度,則角度值應設為 90。 此外,如果你想要在旋轉圖像時保留圖像的邊界,你可以使用 cv2.warpAffine() 函數的 borderValue參數來設置(255,255,255)。這樣會將旋轉後圖像的邊界填充為白色。
-
調整圖片的亮度
Continue Reading…: 調整圖片的亮度可以使用 OpenCV 的 cv2.convertScaleAbs() 函數來增亮圖像。這個函數會將圖像的每個像素值乘上一個指定的比例因子並加上一個常數,以此來調整圖像的亮度。 請注意,這個函數可能會導致圖像中的一些像素值超出 0 到 255 的範圍,因此你可能需要在函數末尾使用new_image = np.where(new_image > 255, 255, new_image)來將這些像素值限制在合法範圍內。
-
用opencv做圖像融合
Continue Reading…: 用opencv做圖像融合OpenCV 的 cv2.addWeighted() 函數可用來實現圖像增量。 這個函數有三個輸入參數: src1: 第一個輸入圖像,應該是第一幅圖像的數組。 alpha: 一個浮點數,用於決定第一幅圖像在輸出圖像中的權重。 src2: 第二個輸入圖像,應該是第二幅圖像的數組。 此函數返回值為加權的結果,其中第一幅圖像的權重為 alpha,第二幅圖像的權重為 1-alpha。 例如,假設你想要將第一幅圖像的 50% 与第二幅圖像的 50%相加,你可以使用以下代碼: PS: 在使用 cv2.addWeighted() 函數時,兩幅圖像的大小必須相同,否則會出現錯誤。
-
為每個python專案建立獨立的虛擬環境
Continue Reading…: 為每個python專案建立獨立的虛擬環境甚麼是虛擬環境 虛擬環境 (virtual environment) 是一個隔離的 Python 環境,可以讓您在同一台電腦上安裝不同版本的 Python 套件,或是不同專案之間使用不同的套件版本。 使用虛擬環境可以幫助您避免不同專案之間因為套件版本不同而造成的衝突。例如,如果您有兩個專案,一個專案需要使用舊版本的套件,而另一個專案需要使用新版本的套件,您可以在兩個專案中分別建立兩個虛擬環境,並在每個虛擬環境中安裝所需的套件版本。這樣就可以避免在不同專案中使用不同版本的套件造成的衝突。 虛擬環境還可以讓您在不影響全域環境的情況下,安裝、卸載或更新套件。這對於在測試某些套件時特別有用,因為您可以在虛擬環境中安裝或卸載套件,而不用擔心會對全域環境造成影響。 總的來說,虛擬環境可以讓您更輕鬆地在同一台電腦上進行多個 Python 專案的開發,並且可以有效地隔離不同專案之間的套件版本。 於Windows建立虛擬環境 要建立新的虛擬環境,請選擇 Python 解譯器,並建立用來存放的 .\venv 目錄: 啟動虛擬環境: 在不影響主機系統設定的情況下,在虛擬環境中安裝套件。首先,請升級 pip: 之後再離開虛擬環境: 於macOS建立虛擬環境 要建立新的虛擬環境,請選擇 Python 解譯器,並建立用來存放的 ./venv 目錄: 使用殼層特定的指令啟動虛擬環境: 虛擬環境啟用時,你的殼層提示會包含 (venv) 前置字元。 在不影響主機系統設定的情況下,在虛擬環境中安裝套件。首先,請升級 pip: 之後再離開虛擬環境: 啟動虛擬環境 可使使用下列指令啟動已建立好的虛擬環境 為你的專案設定使用函式庫的列表…
-
圖像處理之圖像金字塔
Continue Reading…: 圖像處理之圖像金字塔理論 通常,我們使用尺寸固定的圖像。但在某些情況下,我們需要使用不同分辨率的(相同)圖像。例如,當我們在圖像中搜索物體時,比如人臉,我們並不確定物體出現在圖像中的大小。在這種情況下,我們需要創建一組具有不同分辨率的圖像,並在所有圖像中搜索對象。這些不同分辨率的圖像被稱為圖像金字塔(如果將它們放在一起,最高分辨率的圖像在底部,最低分辨率的圖像在頂部,它看起來像一個金字塔)。 圖像金字塔有兩種:高斯金字塔和拉普拉斯金字塔 高斯金字塔 高斯金字塔的高層(低層)圖像是通過去除低層(高層)圖像中的連續行和列來實現的。再由下一層的5個像素的高斯權值貢獻構成上一層的每個像素。這樣,一個M×N圖像就變成了M/2×N/2圖像。所以面積減少到原來的四分之一。它被稱為Octave。同樣的模式持續到金字塔的上方(即分辨率下降)。同樣地,在擴展過程中,每一層的面積會增加4倍。我們可以使用cv.pyrDown()和cv.pyrUp()函數找到高斯金字塔。 可以使用cv.pyrUp()函數放大圖像 拉普拉斯金字塔 拉普拉斯金字塔是由高斯金字塔形成的。拉普拉斯金字塔圖像就像邊緣圖像。它的大部分元素都是0。它們用於圖像壓縮。拉普拉斯金字塔的層次是由高斯金字塔的這一層次與高斯金字塔上一層次的擴展版之間相減形成的。Laplacian層次的三個層次如下(調整對比度以增強內容): 使用圖像金字塔實現圖像混合 金字塔的一個應用是圖像混合。 例如,在圖像拼接中,你將需要將兩個圖像疊加在一起,但由於圖像之間的不連續性,可能看起來不太好。 在這種情況下,使用金字塔圖像混合可以實現無縫混合,而不會在圖像中留下太多數據。 其中一個經典的例子就是混合兩種水果,橙子和蘋果。 現在看看結果本身來理解我在說什麼: 簡單地說就是這樣做的: 1. 加載蘋果和橘子的兩個圖像 2. 尋找蘋果和橘子的高斯金字塔(在這個例子中,層數是6) 3. 從高斯金字塔,找到他們的拉普拉斯金字塔 4. 現在把蘋果的左半部分和橘子的右半部分加入拉普拉斯金字塔的每一層 5. 最後,從這個聯合圖像金字塔,重建原始圖像。
-
使用模板匹配查找圖像中的對象
Continue Reading…: 使用模板匹配查找圖像中的對象模板匹配 參考此篇教學: https://docs.opencv.org/4.x/d4/dc6/tutorial_py_template_matching.html 使用範例如下: 使用cv.matchTemplate(), cv.minMaxLoc()與方式,當模板在圖片中被縮放或旋轉後,匹配成效不佳。 但實際應用中,物件在3D範圍內很常會被縮放或旋轉,就無法使用上述模板匹配方式 改良方法 嘗試Features2DFramework 中的 openCV 函數。例如SIFT或SURF描述符,以及FLANN匹配器。另外,您將需要findHomography方法。 這是在場景中查找旋轉對象的一個很好的例子。 簡而言之,算法是這樣的: 尋找目標圖像的關鍵點(Keypoints) 從這些關鍵點(Keypoints)中提取描述符(des) 尋找場景圖像的關鍵點 從關鍵點提取描述符 通過匹配器匹配描述符 分析圖片內容尋找目標圖像 有不同類別的 FeatureDetectors、DescriptorExtractors 和 DescriptorMatches,選擇適合的任務的那些。 以下為提取關鍵點的一個範例 更多資訊 Feature Detection scale and rotation Template matching
-
使用opencv尋找邊緣
Continue Reading…: 使用opencv尋找邊緣使用Canny算子 Canny 邊緣檢測是一種從不同的視覺對像中提取有用的結構信息並顯著減少要處理的數據量的技術。它已廣泛應用於各種計算機視覺系統。Canny發現,邊緣檢測在不同視覺系統上的應用需求是比較相似的。因此,可以在各種情況下實施滿足這些要求的邊緣檢測解決方案。邊緣檢測的一般標準包括: 錯誤率低的邊緣檢測,這意味著檢測應該盡可能準確地捕獲圖像中顯示的邊緣 算子檢測到的邊緣點應該準確地定位在邊緣的中心。 圖像中的給定邊緣應僅標記一次,並且在可能的情況下,圖像噪聲不應產生錯誤邊緣。 以下為一個簡單使用範例 使用cartToPolar 使用 cv2.Sobel 函數計算圖像的梯度值和方向,並使用 cv2.cartToPolar 函數將梯度值和方向轉換為極坐標形式。 在上面的方法中,要注意的是使用cv.CV_64F能有較好的結果,若想要有CV_8U的結果,可以先採用CV_64F再用下面方式轉為CV_8U 分水嶺演算法 OpenCV 實現了一種基於標記的分水嶺算法,您可以在其中指定哪些是要合併的所有谷點,哪些不是。它是一種交互式圖像分割。我們所做的是為我們所知道的對象賦予不同的標籤。用一種顏色(或強度)標記我們確定是前景或物體的區域,用另一種顏色標記我們確定是背景或非物體的區域,最後是我們不確定的區域,用 0 標記它。那是我們的標記。然後應用分水嶺算法。然後我們的標記將使用我們提供的標籤進行更新,並且對象的邊界值為 -1。 下面是我自己的嘗試
-
圖片降維處理(從彩色變灰階再變黑白)
Continue Reading…: 圖片降維處理(從彩色變灰階再變黑白)從彩色變灰階 使用 cv.cvtColor()函數可作色彩的空間轉換,例如要偵測顏色時,要轉成HSV 而降為灰階則為 從灰階到黑白 要把圖片從灰階變成黑白很簡單。對於每個像素,應用相同的閾值。如果像素值小於閾值,則設置為0,否則設置為最大值。函數cv.threshold用於應用閾值。第一個參數是源圖像,應該是灰度圖像。第二個參數是用於對像素值進行分類的閾值。第三個參數是分配給超過閾值的像素值的最大值。 可使用參數cv.threshold和cv.adaptiveThreshold。 cv.threshold 使用範例 cv.adaptiveThreshold 在cv.threshold使用一個全局值作為閾值。但這可能並不適用於所有情況,例如,如果圖像在不同區域具有不同的光照條件。在這種情況下,自適應閾值可以提供幫助。在這裡,算法根據像素周圍的小區域確定像素的閾值。因此,我們為同一圖像的不同區域獲得不同的閾值,這為具有不同光照的圖像提供了更好的結果。 除了上述參數外,方法cv.adaptiveThreshold 還需要三個輸入參數: adaptiveMethod決定如何計算閾值: cv.ADAPTIVE_THRESH_MEAN_C:閾值是鄰域面積的平均值減去常量C。 cv.ADAPTIVE_THRESH_GAUSSIAN_C :閾值是鄰域值減去常量C的高斯加權和。 blockSize確定鄰域區域的大小,C是從鄰域像素的平均值或加權總和中減去的常數。 下面比較了具有不同光照的圖像的全局閾值和自適應閾值: cv.threshold使用THRESH_OTSU 在全局閾值中,使用任意選擇的值作為閾值。相反,Otsu 的方法避免了必須選擇一個值並自動確定它。 考慮只有兩個不同圖像值的圖像(雙峰圖像),其中直方圖僅包含兩個峰值。一個好的閾值應該在這兩個值的中間。類似地,Otsu 的方法從圖像直方圖中確定最佳全局閾值。 為此,使用了cv.threshold()函數,其中cv.THRESH_OTSU作為額外標誌傳遞。閾值可以任意選擇。然後算法找到最佳閾值,該閾值作為第一個輸出返回。 查看下面的示例。輸入圖像是有噪聲的圖像。在第一種情況下,應用值為 127 的全局閾值。在第二種情況下,直接應用 Otsu 的閾值。在第三種情況下,首先使用 5×5 高斯核對圖像進行濾波以去除噪聲,然後應用 Otsu 閾值處理。查看噪聲過濾如何改善結果。
-
對圖像做幾何變換
Continue Reading…: 對圖像做幾何變換目標 學習對圖像應用不同的幾何變換,如平移、旋轉、仿射變換等。 你會看到這些功能:cv.getPerspectiveTransform 縮放 只是調整圖像的大小。interpolation參數有下面幾種 使用範例 平移 平移影像,下面程式會將圖,x 軸平移 100,y 軸平移 50 旋轉影像 仿射變換 透視變換 這個方法可以把3D的有角度的長方形,拉成2D的長方形,很常會用來使用在3為空間的像照片、名片等拉平的效果上
-
opencv圖像運算
Continue Reading…: opencv圖像運算理論 形態變換是一些基於圖像形狀的簡單操作。它通常在二進製圖像上執行。它需要兩個輸入,一個是我們的原始圖像,第二個稱為結構元素或內核,它決定了操作的性質。兩個基本的形態學算子是侵蝕和膨脹。然後它的變體形式如開、閉、梯度等也開始發揮作用。我們將在下圖的幫助下一一看到它們: 侵蝕cv2.erode 侵蝕的基本思想就像土壤侵蝕一樣,它侵蝕掉前景物體的邊界(總是盡量讓前景保持白色)。那它有什麼作用呢?內核在圖像中滑動(如在 2D 卷積中)。只有當內核下的所有像素都為 1 時,原始圖像中的像素(1 或 0)才會被認為是 1,否則它會被腐蝕(變為零)。 所以發生的事情是,根據內核的大小,邊界附近的所有像素都將被丟棄。因此,前景對象的厚度或大小會減少,或者圖像中的白色區域會減少。它對於去除小的白噪聲(正如我們在色彩空間章節中看到的)、分離兩個連接的對像等很有用。 在這裡,作為一個例子,我會使用一個 5×5 的內核。讓我們看看它是如何工作的: 膨脹Dilation 它與侵蝕正好相反。這裡,如果內核下的至少一個像素為“1”,則像素元素為“1”。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪聲等情況下,腐蝕之後是膨脹。因為,腐蝕去除了白噪聲,但它也縮小了我們的對象。所以我們擴大它。由於噪音消失了,它們不會回來,但我們的對象區域增加了。它還可用於連接對象的損壞部分。 去噪cv2.MORPH_OPEN 在去除噪聲方面很有用。這裡我們使用函數cv2.morphologyEx() 關閉線條 對關閉前景對象內的小孔或對像上的小黑點很有用。這個我也有使用來把canny所找到的邊緣關起來 形態梯度 這是圖像膨脹和腐蝕之間的區別。結果將看起來像對象的輪廓。 Top Hat 使用cv2.MORPH_TOPHAT Black Hat 使用cv2.MORPH_GRADIENT 更多資訊: https://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm
Search
About Me
17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。
如果你認同我或想支持我的努力,歡迎請我喝一杯咖啡!讓我更有動力分享知識!