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>

        常見(jiàn)的圖像處理技術(shù)

        共 6287字,需瀏覽 13分鐘

         ·

        2022-02-20 23:27

        點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺(jué)”公眾號(hào)

        視覺(jué)/圖像重磅干貨,第一時(shí)間送達(dá)

        本期文章中,讓我們一起來(lái)學(xué)習(xí)以下內(nèi)容。


        • 通過(guò)PIL和OpenCV來(lái)使用一些常見(jiàn)的圖像處理技術(shù),例如將RGB圖像轉(zhuǎn)換為灰度圖像、旋轉(zhuǎn)圖像、對(duì)圖像進(jìn)行消噪、檢測(cè)圖像中的邊緣以及裁剪圖像中的感興趣區(qū)域。


        • 使用OpenCV中的模板匹配搜索圖像中的對(duì)象。


        所需安裝的庫(kù):PIL、OpenCV、imutils


        為什么我們需要學(xué)習(xí)圖像處理技術(shù)?


        深度學(xué)習(xí)對(duì)于圖像的分析、識(shí)別以及語(yǔ)義理解具有重要意義。“圖像分類(lèi)”、“對(duì)象檢測(cè)”、“實(shí)例分割”等是深度學(xué)習(xí)在圖像中的常見(jiàn)應(yīng)用。為了能夠建立更好的訓(xùn)練數(shù)據(jù)集,我們必須先深入了解基本的圖像處理技術(shù),例如圖像增強(qiáng),包括裁剪圖像、圖像去噪或旋轉(zhuǎn)圖像等。其次基本的圖像處理技術(shù)同樣有助于光學(xué)字符識(shí)別(OCR)。


        圖像處理技術(shù)通過(guò)識(shí)別關(guān)鍵特征或讀取圖像中的文本信息,來(lái)提高圖像的可解釋性,以便對(duì)圖像中存在的對(duì)象進(jìn)行分類(lèi)或檢測(cè)。


        圖片來(lái)源于Unsplash


        此處提供代碼和圖像


        導(dǎo)入所需的庫(kù)

        import cv2from PIL import Image


        首先我們使用OpenCV和PIL顯示圖像


        使用OpenCV讀取和顯示圖像

        image = cv2.imread(r'love.jpg')cv2.imshow("Image", image)cv2.waitKey(0)


        如果圖像太大,圖像的窗口將不匹配屏幕顯示比例。


        那么如何在屏幕上顯示完整的圖像?


        默認(rèn)情況下,顯示超大圖像時(shí)圖像都會(huì)被裁剪,不能被完整顯示出來(lái)。為了能夠查

        看完整圖像,我們將使用OpenCV中的namedWindow(name, flag)來(lái)創(chuàng)建一個(gè)新的顯示圖像窗口。


        第一個(gè)參數(shù)name是窗口的標(biāo)題,將被用作標(biāo)識(shí)符。?當(dāng)您將flag設(shè)置為cv2.WINDOW_NORMAL時(shí),將顯示完整圖像,并可以調(diào)整窗口大小。當(dāng)然flag參數(shù)還有選擇。

        image = cv2.imread(r'love.jpg')cv2.namedWindow('Normal Window', cv2.WINDOW_NORMAL)cv2.imshow('Normal Window', image)cv2.waitKey(0)


        調(diào)整圖像的尺寸


        當(dāng)我們調(diào)整圖像大小時(shí),我們可以更改圖像的高度或?qū)挾龋蛟诒3謱捀弑炔蛔兊那闆r下同時(shí)變化高度和寬度。圖片的寬高比是圖片的寬度與高度的比。

        image= cv2.imread(r'taj.jpg')scale_percent =200 # percent of original sizewidth = int(image.shape[1] * scale_percent / 100)height = int(image.shape[0] * scale_percent / 100)dim = (width, height)resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)cv2.imshow("Resize", resized)cv2.waitKey(0)


        使用PIL讀取和顯示圖像


        我們將使用open()加載圖像,然后使用show()進(jìn)行顯示。


        使用image.show()創(chuàng)建一個(gè)臨時(shí)文件

        pil_image= Image.open(r'love.jpg')pil_image.show("PIL Image")


        如果我們對(duì)圖像中目標(biāo)的邊緣或其他特征感興趣,要如何對(duì)他們進(jìn)行識(shí)別呢?


        灰度圖像常常用于識(shí)別目標(biāo)物體的邊緣,因?yàn)榛叶葓D像不僅助于理解圖像中對(duì)比度、陰影漸變,而且有助于理解圖像特征。


        與灰度圖像的2D通道相比,RGB圖像具有三個(gè)通道:紅色,綠色和藍(lán)色。與彩色圖像相比,灰度圖像每個(gè)像素的信息更少,因此灰度圖像的處理時(shí)間將更快。


        使用OpenCV對(duì)彩色圖像進(jìn)行灰度縮放


        以下是使用cvtColor()將彩色圖像轉(zhuǎn)換為灰度圖像的方法及轉(zhuǎn)換結(jié)果。

        image = cv2.imread(r'love.jpg')gray_image= cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)cv2.namedWindow('Gray Image', cv2.WINDOW_NORMAL)cv2.imshow('Gray Image', gray_image)cv2.waitKey(0)


        完成轉(zhuǎn)換的灰度圖


        使用PIL對(duì)彩色圖像進(jìn)行灰度縮放


        convert()提供了此圖像轉(zhuǎn)換的另一種方式,?“ L”模式用于轉(zhuǎn)換為灰度圖像,“ RGB”模式用于轉(zhuǎn)換為彩色圖像。

        pil_image= Image.open(r'love.jpg')gray_pil=pil_image.convert('L')gray_pil.show()


        使用OpenCV進(jìn)行邊緣檢測(cè)


        我們將使用Canny算子對(duì)圖像中的邊緣進(jìn)行檢測(cè)。Canny邊緣檢測(cè)是通過(guò)灰度圖像,使用高階算法完成的。


        Canny():第一個(gè)參數(shù)是輸入圖像,第二個(gè)和第三個(gè)參數(shù)是閾值1閾值2的值。


        強(qiáng)度梯度大于threshold2的邊緣被視為邊緣,低于threshold1的邊緣被視為非邊緣。非邊緣將被刪除。兩個(gè)閾值之間的任何梯度強(qiáng)度值都根據(jù)它們的連通性被分類(lèi)為邊緣或非邊緣。

        image= cv2.imread(r'taj.jpg')cv2.namedWindow("Edge", cv2.WINDOW_NORMAL)denoised_image = cv2.Canny(image, 100,200 )cv2.imshow("Edge", denoised_image)cv2.waitKey(0)


        Canny邊緣處理


        如果圖像發(fā)生一定的傾斜或旋轉(zhuǎn),應(yīng)該怎樣進(jìn)行調(diào)整?


        OCR對(duì)傾斜文本的提取效果不佳,因此我們需要對(duì)原圖像進(jìn)行校正??梢允褂肙penCV和PIL中的rotate()對(duì)圖像進(jìn)行角度校正。


        使用OpenCV旋轉(zhuǎn)圖像


        rotate()會(huì)依據(jù)函數(shù)中的第二個(gè)參數(shù)rotationCode的值來(lái)旋轉(zhuǎn)圖像。

        旋轉(zhuǎn)參數(shù)值有以下幾種:

        • cv2.ROTATE_90_CLOCKWISE


        • cv2. ROTATE_90_COUNTERCLOCKWISE


        • cv2.ROTATE_180


        image = cv2.imread(r'love.jpg')cv2.namedWindow("Rotated Image", cv2.WINDOW_NORMAL)rotated_img= cv2.rotate(image,cv2.ROTATE_90_CLOCKWISE )cv2.imshow("Rotated Image", rotated_img)cv2.waitKey(0)


        使用OpenCV將圖像順時(shí)針旋轉(zhuǎn)90度



        如果我們想將圖像旋轉(zhuǎn)特定角度怎么辦?


        根據(jù)特定角度旋轉(zhuǎn)圖像


        在下面的代碼中,圖像以60度為增量旋轉(zhuǎn)


        使用?imutils中的rotate()


        import imutilsimport numpy as npimage = cv2.imread(r'love.jpg')# loop over the rotation anglesfor angle in np.arange(0, 360, 60):    cv2.namedWindow("Rotated", cv2.WINDOW_NORMAL)    rotated = imutils.rotate(image, angle)    cv2.imshow("Rotated", rotated)    cv2.waitKey(0)


        使用imutils以60度為增量旋轉(zhuǎn)圖像


        使用PIL旋轉(zhuǎn)圖像


        此處使用PIL將圖像旋轉(zhuǎn)110度

        pil_image= Image.open(r'love.jpg')rotate_img_pil=pil_image.rotate(110)rotate_img_pil.show()


        使用PIL將圖像旋轉(zhuǎn)110度


        當(dāng)圖像因噪聲而變差并影響圖像分析時(shí),我們應(yīng)該如何提高圖像質(zhì)量?


        使用OpenCV對(duì)圖像進(jìn)行除噪


        噪聲并不是我們想得到的信號(hào),就圖像而言,它會(huì)使圖像受到干擾而失真。


        使用OpenCV最小化圖像中出現(xiàn)的噪聲,首先輸入含有噪聲的圖像

        image= cv2.imread(r'taj.jpg')cv2.namedWindow("Noised Image", cv2.WINDOW_NORMAL)cv2.imshow("Noised Image", image)cv2.waitKey(0)



        OpenCV有多種方法可以消除圖像中的噪點(diǎn)。我們將使用cv.fastNlMeansDenoisingColored(),來(lái)消除彩色圖像中的噪點(diǎn)。

        fastNIMeansDenoising函數(shù)的常見(jiàn)參數(shù):

        • src:?源圖像

        • dst:?輸出與src具有相同大小和類(lèi)型的圖像


        • h:?調(diào)節(jié)過(guò)濾器強(qiáng)度。?較高的h值可以完全消除噪點(diǎn)和圖像細(xì)節(jié),較小的h值可以保留圖像細(xì)節(jié)以及一些噪點(diǎn)。


        • hForColorComponents:?與h相同,但僅用于彩色圖像,通常與h相同


        • templateWindowSize:?默認(rèn)0(推薦7)


        • searchWindowSize:?默認(rèn)0(推薦21)


        image= cv2.imread(r'taj.jpg')cv2.namedWindow("Denoised Image", cv2.WINDOW_NORMAL)denoised_image = cv2.fastNlMeansDenoisingColored(image,None, h=5)cv2.imshow("Denoised Image", denoised_image)cv2.waitKey(0)

        如何從圖像中提取某些感興趣的區(qū)域?

        裁剪圖像

        裁剪圖像可讓我們提取圖像中的興趣區(qū)域。

        我們將裁剪泰姬陵的圖像,從圖像中刪除其他細(xì)節(jié),使圖像僅保留泰姬陵。

        使用OpenCV裁剪圖像

        在OpenCV中裁剪是通過(guò)將圖像數(shù)組切成薄片來(lái)進(jìn)行的,我們先傳遞y坐標(biāo)的起點(diǎn)和終點(diǎn),然后傳遞x坐標(biāo)的起點(diǎn)和終點(diǎn)。

        image[y_start:y_end, x_start:x_end]

        image= cv2.imread(r'taj.jpg')resized_img= image[15:170, 20:200]cv2.imshow("Resize", resized_img)cv2.waitKey(0)


        使用PIL裁剪圖像


        PIL的crop()允許我們裁剪圖像的矩形區(qū)域。crop()的參數(shù)是矩形左上角和右下角的像素坐標(biāo)。

        pil_image = Image.open(r'taj.jpg')
        # Get the Size of the image in pixels width, height = pil_image.size
        # Setting the cropped image co-ordinatesleft = 3top = height /25right = 200bottom = 3 * height / 4
        # Crop the image based on the above dimension cropped_image = pil_image.crop((left, top, right, bottom))
        # Shows the image in image viewer cropped_image.show()

        模板匹配

        我們可以提供模板和OpenCV中的matchTemplate()在圖像中搜索該模板并提取其位置。

        這個(gè)模板會(huì)像卷積神經(jīng)網(wǎng)絡(luò)一樣在整個(gè)圖像上滑動(dòng),并嘗試將模板與輸入圖像進(jìn)行匹配。

        minMaxLoc()用于獲取最大值/最小值,它是通過(guò)矩形的左上角開(kāi)始沿著寬度和高度獲取值。

        模板匹配有6種方法:

        • cv2.TM_SQDIFF



        • cv2.TM_SQDI



        • cv2.TM_C


        • cv2.TM_CCORR_NORMED


        • cv2.TM_CCOEFF


        • cv2.TM_CCOEFF_NORMED


        在下面的示例中,我們將從主圖中裁剪一小部分創(chuàng)建模板。

        用于模板匹配的方法是TM_CCOEFF_NORMED。匹配的閾值設(shè)置為0.95。當(dāng)匹配概率大于0.95時(shí),該函數(shù)將會(huì)在與該匹配相對(duì)應(yīng)的區(qū)域周?chē)L制一個(gè)矩形。

        import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'love.jpg',0)cv2.imshow("main",img)cv2.waitKey(0)template = cv2.imread(r'template1.png',0)cv2.imshow("Template",template)cv2.waitKey(0)w, h = template.shape[::-1]methods = [ 'cv2.TM_CCOEFF_NORMED']for meth in methods:
        method = eval(meth)# Apply template Matching res = cv2.matchTemplate(img,template,method) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) threshold=0.95 loc=np.where(res>threshold) if len(loc[0])>0:# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum if method in [ cv2.TM_SQDIFF_NORMED]: top_left = min_loc bottom_right = (top_left[0] + w, top_left[1] + h)cv2.rectangle(img,top_left, bottom_right,100,20)plt.subplot(121),plt.imshow(res,cmap = 'gray') plt.title('Matching Result'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(img,cmap = 'gray') plt.title('Detected Point'), plt.xticks([]), plt.yticks([]) plt.suptitle(meth)plt.show() else: print("Template not matched")


        結(jié)論

        我們所討論的最常見(jiàn)圖像處理技術(shù)可用于分析圖像,例如圖像分類(lèi),目標(biāo)檢測(cè)以及OCR。


        本文僅做學(xué)術(shù)分享,如有侵權(quán),請(qǐng)聯(lián)系刪文。

        —THE END—
        瀏覽 78
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            国内精品内射 | 日韩h视频 | 72式性真人无遮挡没费视频 | 肉大捧一出免费视频 | 欧美三级导航 | 宅男噜噜噜一区二区三区 | 香蕉操逼视频 | 91一区二区三区在线 | 欧美综合第一页 | 宝贝把胸罩脱了让我揉你的胸 |