Python+OpenCV圖片局部區(qū)域像素值處理詳解
背景故事:我需要對(duì)一張圖片做一些處理,是在圖像像素級(jí)別上的數(shù)值處理,以此來反映圖片中特定區(qū)域的圖像特征,網(wǎng)上查了很多,大多關(guān)于opencv的應(yīng)用教程帖子基本是停留在打開圖片,提取像素重新寫入圖片啊之類的基本操作,我是要取圖片中的特定區(qū)域再提取它的像素值,作為一個(gè)初學(xué)者開始接觸opencv簡(jiǎn)直一臉懵,慢慢摸索著知道了opencv的一些函數(shù)是可以實(shí)現(xiàn)的像SetImageROI()函數(shù)設(shè)置ROI區(qū)域,即感興趣區(qū)域,就很好用啊,總之最后是實(shí)現(xiàn)了自己想要的功能?,F(xiàn)在看個(gè)程序確實(shí)是有點(diǎn)挫,也有好多多余的沒必要的代碼,但畢竟算一次碼代碼的歷程,就原模原樣貼在這里吧。
代碼功能:在python下用opencv
- 打開圖片并顯示并重新寫入新的文件
- 提取圖片特定區(qū)域的像素值(根據(jù)自己需求,下面在代碼中注解)
- 對(duì)提取出來的像素值做處理用matplotlib顯示成條形圖
源碼貼在下面:
# -*- coding:utf-8 -*- __author__ = 'lwp' import cv2.cv as cv import numpy as np import matplotlib.pyplot as plt # 文件路徑 path = '/media/lwp/A/4.bmp' # 載入一張圖片,參數(shù)cv.CV_LOAD_IMAGE_GRAYSCALE為打開為灰度圖 lwpImg = cv.LoadImage(path, cv.CV_LOAD_IMAGE_GRAYSCALE) # 創(chuàng)建圖像空間,參數(shù)為size, depth, channels,這里設(shè)置的是圖片等高寬30個(gè)像素的一個(gè)區(qū)域,8位,灰度圖 box_lwpImg = cv.CreateImage((30, 576), 8, 1) # 創(chuàng)建窗口 cv.NamedWindow('test1', cv.CV_WINDOW_AUTOSIZE) cv.NamedWindow("box_test1", cv.CV_WINDOW_AUTOSIZE) # 設(shè)置ROI區(qū)域,即感興趣區(qū)域,參數(shù)為x, y, width, heigh cv.SetImageROI(lwpImg, (390, 0, 30, 576)) # 提取ROI,從lwpImg圖片的感興趣區(qū)域到box_lwpImg cv.Copy(lwpImg, box_lwpImg) # 對(duì)box區(qū)域進(jìn)行循環(huán)提取像素值存到列表pixel_list中 pixel_list = [] for i in range(576): # 576為box的高 for j in range(30): # 30為box的寬 x = box_lwpImg[i, j] pixel_list.append(x) # 提取的像素值轉(zhuǎn)為int整型賦給一維數(shù)組pixel_list_np_1 pixel_list_np_1 = np.array(pixel_list, dtype=int) # 轉(zhuǎn)為576*30的二位數(shù)組,即按圖片box排列 pixel_list_np_2 = np.array(pixel_list_np_1).reshape(576, 30) # 行求和,得到576個(gè)值,即每行的像素信息 pixel_sum = np.sum(pixel_list_np_2, axis=1) # 取消設(shè)置 cv.ResetImageROI(lwpImg) # 畫目標(biāo)區(qū)域 lwpImg = cv.Rectangle(lwpImg, (390, 0), (425, 576), (0, 255, 0), 2) # 顯示圖像 cv.ShowImage('test1', lwpImg) # 查看列表list長(zhǎng)度,以確定像素值提取準(zhǔn)確 list_length = len(pixel_list) print list_length # 查看數(shù)組維度,shape驗(yàn)證 print pixel_list_np_1.ndim print pixel_list_np_1.shape print pixel_list_np_1 print pixel_list_np_2.ndim print pixel_list_np_2.shape print pixel_list_np_2 print pixel_sum # 畫條形圖 plt.figure(1) width = 1 for i in range(len(pixel_sum)): plt.figure(1) plt.bar(i, pixel_sum[i], width) plt.xlabel("X") plt.ylabel("pixel_sum") plt.show() # 按ESC退出,按s保存圖片 k = cv.WaitKey(0) if k == 27: # wait for ESC key to exit cv.DestroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv.WriteFrame('copy_test.png', lwpImg) cv.DestroyAllWindows()
補(bǔ)充:這個(gè)代碼雖然實(shí)現(xiàn)了我需要的功能,之后在對(duì)視頻流做同樣像素值提取處理并繪圖的時(shí)候,意識(shí)到圖片本就是數(shù)組形式,對(duì)于8位灰度圖,通道數(shù)為1,它就是個(gè)二位數(shù)組,這樣就沒有必要再設(shè)置ROI區(qū)域,復(fù)制出來這塊區(qū)域再循環(huán)提取像素存入數(shù)組進(jìn)行處理了,可以直接將圖片存入數(shù)組,再利用numpy進(jìn)行相應(yīng)的數(shù)組操作就可以了,這樣一想就簡(jiǎn)單很多了,下篇會(huì)寫對(duì)數(shù)據(jù)流的處理,直接讀取視頻文件或直接從內(nèi)存取攝像頭的視頻流進(jìn)行處理,未完待續(xù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python自動(dòng)化實(shí)現(xiàn)的簡(jiǎn)單使用
本文主要介紹了python自動(dòng)化實(shí)現(xiàn)的簡(jiǎn)單使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06利用Python寫個(gè)摸魚監(jiān)控進(jìn)程
繼打游戲、看視頻等摸魚行為被監(jiān)控后,現(xiàn)在打工人離職的傾向也會(huì)被監(jiān)控。今天就帶大家領(lǐng)略一下怎么寫幾行Python代碼,就能監(jiān)控電腦,感興趣的可以學(xué)習(xí)一下2022-02-02python實(shí)現(xiàn)二級(jí)登陸菜單及安裝過程
這篇文章主要介紹了python實(shí)現(xiàn)二級(jí)登陸菜單及安裝過程,,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06python bluetooth藍(lán)牙信息獲取藍(lán)牙設(shè)備類型的方法
這篇文章主要介紹了python bluetooth藍(lán)牙信息獲取藍(lán)牙設(shè)備類型的方法,具體轉(zhuǎn)化方法文中給大家介紹的非常詳細(xì),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11python實(shí)現(xiàn)局域網(wǎng)內(nèi)實(shí)時(shí)通信代碼
今天小編就為大家分享一篇python實(shí)現(xiàn)局域網(wǎng)內(nèi)實(shí)時(shí)通信代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12