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的圖像翻轉(zhuǎn)和鏡像

        共 5649字,需瀏覽 12分鐘

         ·

        2021-01-01 01:13

        點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        本期,我們將解釋如何在Python中實(shí)現(xiàn)圖像的鏡像或翻轉(zhuǎn)。大家只需要了解各種矩陣運(yùn)算和矩陣操作背后的基本數(shù)學(xué)即可。


        01. 依賴(lài)包要求

        NumPy —用于矩陣運(yùn)算并對(duì)其進(jìn)行處理。

        OpenCV —用于讀取圖像并將其轉(zhuǎn)換為2D數(shù)組(矩陣)。

        Matplotlib —用于將矩陣?yán)L制為圖像。

        對(duì)于這個(gè)小型項(xiàng)目,我使用了著名的Lena圖像,該圖像主要用于測(cè)試計(jì)算機(jī)視覺(jué)模型。確保下載此映像并將其保存在當(dāng)前工作目錄中。

        import cv2import numpy as npfrom matplotlib import pyplot as plt


        02. 讓我們開(kāi)始吧

        首先,我們使用imread()模塊中的方法讀取圖像文件cv2。為此,我們只需要導(dǎo)入包并使用它即可。因此,通過(guò)這樣做,我們獲得了矩陣形式的圖像。默認(rèn)情況下,imread()該方法讀取的圖像BGR(Blue,Green,Red)格式。要讀取的圖像轉(zhuǎn)換為常規(guī)格式,即,RGB(Red,Green,Blue),我們使用cvtColor()來(lái)自同一模塊的方法cv2。

        def read_this(image_file, gray_scale=False):    image_src = cv2.imread(image_file)    if gray_scale:        image_rgb = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)    else:        image_rgb = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB)    return image_rgb

        上面的函數(shù)從傳遞的圖像文件返回圖像矩陣。如果我們要獲取圖像矩陣或格式,它由常規(guī)if和else條件組成。


        鏡像圖像

        要基本鏡像圖像,我們需要從左到右逐行反轉(zhuǎn)矩陣。讓我們考慮一個(gè)matrix A。

        >>> A = [       [4, 1, 1],       [2, 8, 0],       [3, 8, 1]]


        如果我們要鏡像此矩陣(逐行),則它將是-

        >>> import numpy as np>>> mirror_ = np.fliplr(A)>>> mirror_[[1, 1, 4], [0, 8, 2], [1, 8, 3]]


        我們也可以在不使用NumPy模塊的情況下執(zhí)行此操作。如果是這樣,我們可以使用循環(huán)并反轉(zhuǎn)每一行。如果在圖像矩陣上執(zhí)行相同的操作將花費(fèi)一些時(shí)間,因?yàn)樗鼈兪欠浅4蟮木仃?,并且我們不希望我們的代碼執(zhí)行得非常慢。

        def mirror_this(image_file, gray_scale=False, with_plot=False):    image_rgb = read_this(image_file=image_file, gray_scale=gray_scale)    image_mirror = np.fliplr(image_rgb)    if with_plot:        fig = plt.figure(figsize=(10, 20))        ax1 = fig.add_subplot(2, 2, 1)        ax1.axis("off")        ax1.title.set_text('Original')        ax2 = fig.add_subplot(2, 2, 2)        ax2.axis("off")        ax2.title.set_text("Mirrored")        if not gray_scale:            ax1.imshow(image_rgb)            ax2.imshow(image_mirror)        else:            ax1.imshow(image_rgb, cmap='gray')            ax2.imshow(image_mirror, cmap='gray')        return True    return image_mirror


        上面的函數(shù)返回一個(gè)圖像矩陣,該矩陣從左向右逐行反轉(zhuǎn)或翻轉(zhuǎn)。

        讓我們繪制相同的內(nèi)容-

        mirror_this(image_file="lena_original.png", with_plot=True)


        mirror_this(image_file="lena_original.png", gray_scale=True, with_plot=True)


        翻轉(zhuǎn)圖像

        要基本翻轉(zhuǎn)圖像,我們需要將矩陣從上到下逐列反轉(zhuǎn)。讓我們考慮一個(gè)matrix B。

        >>> B = [       [4, 1, 1],       [2, 8, 0],       [3, 8, 1]]


        如果我們要翻轉(zhuǎn)此矩陣(按列),則它將是-

        >>> import numpy as np>>> flip_= np.flipud(B)>>> flip_[[3, 8, 1], [2, 8, 0], [4, 1, 1]]


        我們NumPy用于翻轉(zhuǎn)矩陣以保持代碼的牢固性。

        def flip_this(image_file, gray_scale=False, with_plot=False):    image_rgb = read_this(image_file=image_file, gray_scale=gray_scale)    image_flip = np.flipud(image_rgb)    if with_plot:        fig = plt.figure(figsize=(10, 20))        ax1 = fig.add_subplot(2, 2, 1)        ax1.axis("off")        ax1.title.set_text('Original')        ax2 = fig.add_subplot(2, 2, 2)        ax2.axis("off")        ax2.title.set_text("Flipped")        if not gray_scale:            ax1.imshow(image_rgb)            ax2.imshow(image_flip)        else:            ax1.imshow(image_rgb, cmap='gray')            ax2.imshow(image_flip, cmap='gray')        return True    return image_flip


        上面的函數(shù)返回一個(gè)圖像矩陣,該矩陣從上向下向下按列反轉(zhuǎn)或翻轉(zhuǎn)。

        讓我們繪制相同的內(nèi)容-

        flip_this(image_file='lena_original.png', with_plot=True)


        flip_this(image_file='lena_original.png', gray_scale=True, with_plot=True)



        完整的代碼
        class ImageOpsFromScratch(object):    def __init__(self, image_file):        self.image_file = image_file    def read_this(self, gray_scale=False):        image_src = cv2.imread(self.image_file)        if gray_scale:            image_rgb = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)        else:            image_rgb = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB)        return image_rgb    def mirror_this(self, with_plot=True, gray_scale=False):        image_rgb = self.read_this(gray_scale=gray_scale)        image_mirror = np.fliplr(image_rgb)        if with_plot:            self.plot_it(orig_matrix=image_rgb, trans_matrix=image_mirror, head_text='Mirrored', gray_scale=gray_scale)            return None        return image_mirror    def flip_this(self, with_plot=True, gray_scale=False):        image_rgb = self.read_this(gray_scale=gray_scale)        image_flip = np.flipud(image_rgb)        if with_plot:            self.plot_it(orig_matrix=image_rgb, trans_matrix=image_flip, head_text='Flipped', gray_scale=gray_scale)            return None        return image_flip    def plot_it(self, orig_matrix, trans_matrix, head_text, gray_scale=False):        fig = plt.figure(figsize=(10, 20))        ax1 = fig.add_subplot(2, 2, 1)        ax1.axis("off")        ax1.title.set_text('Original')        ax2 = fig.add_subplot(2, 2, 2)        ax2.axis("off")        ax2.title.set_text(head_text)        if not gray_scale:            ax1.imshow(orig_matrix)            ax2.imshow(trans_matrix)        else:            ax1.imshow(orig_matrix, cmap='gray')            ax2.imshow(trans_matrix, cmap='gray')        return True

        基本圖像操作包
        imo = ImageOpsFromScratch(image_file='lena_original.png')### Mirroring ###imo.mirror_this()imo.mirror_this(gray_scale=True)### Flipping ###imo.flip_this()imo.flip_this(gray_scale=True)

        將顯示以上圖像結(jié)果。現(xiàn)在,所有內(nèi)容都已排序,我們可以創(chuàng)建其他圖像操作,例如equalize(),solarize()等等。


        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

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

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

        下載4:leetcode算法開(kāi)源書(shū)
        小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):leetcode,即可下載。每題都 runtime beats 100% 的開(kāi)源好書(shū),你值得擁有!





        交流群


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


        瀏覽 65
        點(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>
            亚洲欧洲高清无码 | 久久男按摩少妇高潮中文字幕 | 强奸乱伦毛片 | 俺来也俺就去www色情网 | 人人人人人操 | 精品香蕉久久久午夜福利 | 在线网址你懂的 | 国产成人小电影 | 干屄视频 | 夜夜爽妓女8888视频免费观看 |