1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        顏色、形狀和紋理:使用 OpenCV 進(jìn)行特征提取

        共 12619字,需瀏覽 26分鐘

         ·

        2023-07-28 07:08

           
        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂
            
        重磅干貨,第一時間送達(dá)
        如何從圖像中提取特征?第一次聽說“特征提取”一詞是在 YouTube 上的機(jī)器學(xué)習(xí)視頻教程中,它清楚地解釋了我們?nèi)绾卧诖笮蛿?shù)據(jù)集中提取特征。
        很簡單,數(shù)據(jù)集的列就是特征。然而,當(dāng)我遇到計(jì)算機(jī)視覺主題時,當(dāng)聽說我們將從圖像中提取特征時,吃了一驚。是否開始瀏覽圖像的每一列并取出每個像素?
        一段時間后,明白了特征提取在計(jì)算機(jī)視覺中的含義。特征提取是降維過程的一部分,其中,原始數(shù)據(jù)的初始集被劃分并減少到更易于管理的組。
        簡單來說,對于圖像,每個像素都是一個數(shù)據(jù),圖像處理所做的只是從圖像中提取有用的信息,從而減少了數(shù)據(jù)量,但保留了描述圖像特征的像素。
        圖像處理所做的只是從圖像中提取有用的信息,從而減少數(shù)據(jù)量,但保留描述圖像特征的像素。
        在本文中,讓我們探索幾種從圖像中提取顏色、形狀和紋理特征的方法。這些方法基于處理圖像的經(jīng)驗(yàn),如果有任何錯誤,請隨時添加或糾正它們!

        1. 顏色

        每次處理圖像項(xiàng)目時,色彩空間都會自動成為最先探索的地方。了解設(shè)置圖像環(huán)境的色彩空間對于提取正確的特征至關(guān)重要。
        使用 OpenCV,我們可以將圖像的顏色空間轉(zhuǎn)換為提供的幾個選項(xiàng)之一,如 HSV、LAB、灰度、YCrCb、CMYK 等。每個顏色空間的簡單分解:
        a. HSV(色相飽和度值)
        • 色調(diào):描述主波長,是指定顏色的通道
        • 飽和度:描述色調(diào)/顏色的純度/色調(diào)
        • :描述顏色的強(qiáng)度
           
        import cv2
        from google.colab.patches import cv2_imshow

        image = cv2.imread(image_file)
        hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        cv2_imshow(hsv_image)
        RGB 與 HSV 顏色空間
        b. LAB
        • L:描述顏色的亮度,與強(qiáng)度互換使用
        • A : 顏色成分范圍,從綠色到品紅色
        • B:從藍(lán)色到黃色的顏色分量
           
        import cv2
        from google.colab.patches import cv2_imshow

        image = cv2.imread(image_file)
        lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
        cv2_imshow(lab_image)
        RGB 與 LAB 色彩空間
        YCrCb
        • Y : 伽馬校正后從 RGB 顏色空間獲得的亮度
        • Cr:描述紅色 (R) 分量與亮度的距離
        • Cb:描述藍(lán)色 (B) 分量與亮度的距離
           
        import cv2
        from google.colab.patches import cv2_imshow

        image = cv2.imread(image_file)
        ycrcb_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
        cv2_imshow(ycrcb_image)
        RGB 與 YCrCb 顏色空間
        這些顏色空間的重要性有時會被低估。為了從圖像中獲得相關(guān)信息,這些顏色空間提供了一個機(jī)會來識別特征是否在每個圖像中看起來更不同。關(guān)于色彩空間最瘋狂的事情是我們可以用不同的色彩空間執(zhí)行加法/減法,結(jié)果你會感到驚訝!
        探索圖像色彩空間的另一個有用函數(shù)是簡單地使用*numpy.mean()*,它給出圖像數(shù)據(jù)集中色彩空間中每個通道的平均值。如果我們想查看顏色空間中的哪個通道主導(dǎo)數(shù)據(jù)集,這將特別有用。
           
        import cv2
        from google.colab.patches import cv2_imshow
        import numpy as np
        import plotly.figure_factory as ff

        # Check the distribution of red values 
        red_values = []
        for i in range(len(images)):
          red_value = np.mean(images[i][:, :, 0])
          red_values.append(red_value)

        # Check the distribution of green values 
        green_values = []
        for i in range(len(images)):
          green_value = np.mean(images[i][:, :, 1])
          green_values.append(green_value)

        # Check the distribution of blue values 
        blue_values = []
        for i in range(len(images)):
          blue_value = np.mean(images[i][:, :, 2])
          blue_values.append(blue_value)
          
        # Plotting the histogram
        fig = ff.create_distplot([red_values, green_values, blue_values], group_labels=["R""G""B"], colors=['red''green''blue'])
        fig.update_layout(showlegend=True, template="simple_white")
        fig.update_layout(title_text='Distribution of channel values across images in RGB')
        fig.data[0].marker.line.color = 'rgb(0, 0, 0)'
        fig.data[0].marker.line.width = 0.5
        fig.data[1].marker.line.color = 'rgb(0, 0, 0)'
        fig.data[1].marker.line.width = 0.5
        fig.data[2].marker.line.color = 'rgb(0, 0, 0)'
        fig.data[2].marker.line.width = 0.5
        fig
        一旦我們已經(jīng)識別或探索了足夠多的圖像色彩空間,并確定我們只對單個通道感興趣,我們就可以使用*cv2.inRange()*來屏蔽不需要的像素。這在 HSV 顏色空間中尤其實(shí)用。
           
        import cv2
        from google.colab.patches import cv2_imshow

        # Reading the original image
        image_spot = cv2.imread(image_file)
        cv2_imshow(image_spot)

        # Converting it to HSV color space
        hsv_image_spot = cv2.cvtColor(image_spot, cv2.COLOR_BGR2HSV)
        cv2_imshow(hsv_image_spot)

        # Setting the black pixel mask and perform bitwise_and to get only the black pixels
        mask = cv2.inRange(hsv_image_spot, (000), (18025540))
        masked = cv2.bitwise_and(hsv_image_spot, hsv_image_spot, mask=mask)
        cv2_imshow(masked)
        RGB vs HSV vs Masked 圖像使用 cv2.inRange() 檢索黑點(diǎn)
        有時,我們甚至可以使用*cv2.kmeans()來量化圖像的顏色,從本質(zhì)上將顏色減少到幾個整潔的像素。根據(jù)我們的目標(biāo),我們可以使用cv2.inRange()*來檢索目標(biāo)像素。通常,這個函數(shù)在識別圖像的重要部分時很有魅力,我總是會在繼續(xù)使用其他顏色特征提取方法之前檢查這個函數(shù)。
           
        import cv2
        from google.colab.patches import cv2_imshow

        image_spot_reshaped = image_spot.reshape((image_spot.shape[0] * image_spot.shape[1], 3))

        # convert to np.float32
        Z = np.float32(image_spot_reshaped)
        # define criteria, number of clusters(K) and apply kmeans()
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 101.0)
        K = 2
        ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
        # Now convert back into uint8, and make original image
        center = np.uint8(center)
        res = center[label.flatten()]
        res2 = res.reshape((image_spot.shape))

        cv2_imshow(res2)
        使用 cv2.kmeans() 進(jìn)行顏色量化 (K=2)

        2. 形狀

        一旦我們充分探索了顏色特征,我們可能會在某個時候想要提取圖像中的形狀。
        例如,你的任務(wù)是區(qū)分不同類型的酒杯。顏色在這里可能并不重要,但形狀可以告訴我們很多關(guān)于它們的信息。
        同樣,我要做的是將圖像轉(zhuǎn)換為其他顏色空間,看看是否有任何顏色空間會使對象的邊緣或形狀更加突出。然后,我們可以使用*cv2.findContours()*來檢索圖像中的所有輪廓。從這里開始,我們將檢查感興趣輪廓的所有屬性。
        理想情況下,一旦我們能夠提取定義輪廓形狀的正確屬性,我們會將其應(yīng)用于數(shù)據(jù)集中的所有圖像,提取的數(shù)字將成為我們新的非圖像數(shù)據(jù)集。看看我們?nèi)绾螌?shù)據(jù)量減少到只有一列形狀特征,仍然可以解釋我們的酒杯圖像嗎?
        讓我們探索一下我們可以使用 OpenCV 從輪廓中提取的許多屬性。正如之前已經(jīng)展示過的,我將在此處提供鏈接以供參考:
        https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html
        1. 輪廓面積
        2. 輪廓周長
        3. 輪廓近似
        4. 凸包
        5. 凸性檢測
        6. 矩形邊界
        7. 最小外接圓
        8. 擬合橢圓
        9. 擬合直線
        在很多情況下發(fā)現(xiàn) cv2.HoughCircles() 和 cv2.SimpleBlobDetector() 在檢測圓圈時都沒有給出準(zhǔn)確的結(jié)果,原因之一可能是預(yù)處理圖像中的圓圈不夠明顯。但是,cv2.SimpleBlobDetector() 仍然提供一些方便的內(nèi)置過濾器,如慣性、凸性、圓度和面積,以盡可能準(zhǔn)確地檢索圓。

        3. 紋理

        在某些時候,我們可能想要提取紋理特征,因?yàn)槲覀円呀?jīng)用盡了顏色和形狀特征。灰度共生矩陣(GLCM)和局部二值模式(LBP)都是我用過的紋理特征,不過大家常用的其他紋理特征也可以在下方評論,我很想知道!
        a. GLCM
        很難在圖像方面特別理解 GLCM 的概念。從統(tǒng)計(jì)學(xué)上講,GLCM 是一種考慮像素空間關(guān)系的紋理檢查方法。它的工作原理是計(jì)算具有特定值和特定空間關(guān)系的像素對在圖像中出現(xiàn)的頻率,創(chuàng)建 GLCM,然后從該矩陣中提取統(tǒng)計(jì)度量。
        包含 GLCM 功能的一個易于使用的包是scikit-image包。在 GLCM 中,我們還可以推導(dǎo)出一些描述更多關(guān)于紋理的統(tǒng)計(jì)數(shù)據(jù),例如:
        • 對比度:測量灰度共生矩陣的局部變化。
        • 相關(guān)性:測量指定像素對的聯(lián)合概率出現(xiàn)。
        • 平方:提供 GLCM 中元素的平方和。也稱為均勻性或角二階矩。
        • 同質(zhì)性:測量 GLCM 中元素分布與 GLCM 對角線的接近程度。
           
        import cv2
        from google.colab.patches import cv2_imshow

        image_spot = cv2.imread(image_file)
        gray = cv2.cvtColor(image_spot, cv2.COLOR_BGR2GRAY)

        # Find the GLCM
        import skimage.feature as feature

        # Param:
        # source image
        # List of pixel pair distance offsets - here 1 in each direction
        # List of pixel pair angles in radians
        graycom = feature.greycomatrix(gray, [1], [0, np.pi/4, np.pi/23*np.pi/4], levels=256)

        # Find the GLCM properties
        contrast = feature.greycoprops(graycom, 'contrast')
        dissimilarity = feature.greycoprops(graycom, 'dissimilarity')
        homogeneity = feature.greycoprops(graycom, 'homogeneity')
        energy = feature.greycoprops(graycom, 'energy')
        correlation = feature.greycoprops(graycom, 'correlation')
        ASM = feature.greycoprops(graycom, 'ASM')

        print("Contrast: {}".format(contrast))
        print("Dissimilarity: {}".format(dissimilarity))
        print("Homogeneity: {}".format(homogeneity))
        print("Energy: {}".format(energy))
        print("Correlation: {}".format(correlation))
        print("ASM: {}".format(ASM))
        從灰度共生矩陣 (GLCM) 獲得的特征
        b.  LBP
        由于已經(jīng)有很多文章解釋了本地二進(jìn)制模式,在這里節(jié)省你的時間并在此處分享參考鏈接:
        • https://www.pyimagesearch.com/2015/12/07/local-binary-patterns-with-python-opencv/
        • https://towardsdatascience.com/face-recognition-how-lbph-works-90ec258c3d6b
        簡而言之,LBP 是一種紋理算子,它通過對周圍像素進(jìn)行閾值處理并以二進(jìn)制數(shù)表示它們來標(biāo)記圖像的像素。LBP 讓我們吃驚的是,該操作返回的灰度圖像清晰地顯示了圖像中的紋理。在這里,我們嘗試根據(jù)理解分解LBP內(nèi)部的操作:
        對于每個中心像素,我們嘗試與周圍像素進(jìn)行比較,如果中心像素大于或小于周圍像素,則給它們一個標(biāo)簽。結(jié)果,我們周圍有 8 個標(biāo)簽,并且通過在整個圖像中保持順時針或逆時針方向的一致模式,我們將它們布置在 2d 數(shù)組中并將它們轉(zhuǎn)換為二進(jìn)制數(shù)。
        在我們對整個圖像的每個像素執(zhí)行操作后會出現(xiàn)這樣的矩陣。
        從這里,我們可以看到,生成的矩陣與我們的原始圖像具有相同的形狀,我們能夠像繪制圖像一樣繪制和顯示 LBP。
           
        import cv2
        from google.colab.patches import cv2_imshow

        class LocalBinaryPatterns:
          def __init__(self, numPoints, radius):
            self.numPoints = numPoints
            self.radius = radius

          def describe(self, image, eps = 1e-7):
            lbp = feature.local_binary_pattern(image, self.numPoints, self.radius, method="uniform")
            (hist, _) = np.histogram(lbp.ravel(), bins=np.arange(0, self.numPoints+3), range=(0, self.numPoints + 2))

            # Normalize the histogram
            hist = hist.astype('float')
            hist /= (hist.sum() + eps)

            return hist, lbp

        image = cv2.imread(image_file)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        desc = LocalBinaryPatterns(248)
        hist, lbp = desc.describe(gray)
        print("Histogram of Local Binary Pattern value: {}".format(hist))

        contrast = contrast.flatten()
        dissimilarity = dissimilarity.flatten()
        homogeneity = homogeneity.flatten()
        energy = energy.flatten()
        correlation = correlation.flatten()
        ASM = ASM.flatten()
        hist = hist.flatten()

        features = np.concatenate((contrast, dissimilarity, homogeneity, energy, correlation, ASM, hist), axis=0
        cv2_imshow(gray)
        cv2_imshow(lbp)
        灰度圖像與 LBP 表示
        類似地,我們可以將 LBP 存儲在直方圖中,并將其視為一個特征,我們可以將其輸入分類器以進(jìn)行分類。PyImageSearch 的 Adrian Rosebrock 在這方面做了一個驚人的例子!
        我在紋理特征方面沒有太多經(jīng)驗(yàn),但是在收集更多信息并嘗試在項(xiàng)目中實(shí)現(xiàn)它們之后,我有興趣深入研究它。

        結(jié)論

        總而言之,在這篇文章中,分享了在之前的項(xiàng)目中使用過的三個特征的經(jīng)驗(yàn),主要是顏色、形狀和紋理特征。連同代碼和結(jié)果,試圖說明我采取每一步的原因。希望你能夠從圖像特征中學(xué)到一些東西,從顏色、形狀和紋理開始。

        參考

        • https://www.analyticsvidhya.com/blog/2019/08/3-techniques-extract-features-from-image-data-machine-learning-python/
        • https://www.mygreatlearning.com/blog/feature-extraction-in-image-processing/
        • https://thevatsalsaglani.medium.com/feature-extraction-from-medical-images-and-an-introduction-to-xtract-features-9a225243e94b
        • http://www.scholarpedia.org/article/Local_Binary_Patterns
        • https://medium.com/mlearning-ai/mlearning-ai-submission-suggestions-b51e2b130bfb
           
        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個基于OpenCV實(shí)現(xiàn)20個實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 530
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            老太色HD色老太HD-百度 a毛看片 | 色综合天天爱综合网 | 在线99| 免费 无码 国产在线观看快色 | 91成人视频 | 久久99久久99精品蜜柚传媒 | 亚洲欲妇xxxxx69 | 色五月丁香婷婷 | 美女视频黄频视频大全 | 日韩做爰成人片 |