Python+OpenCV圖片局部區(qū)域像素值處理詳解
背景故事:我需要對一張圖片做一些處理,是在圖像像素級別上的數(shù)值處理,以此來反映圖片中特定區(qū)域的圖像特征,網(wǎng)上查了很多,大多關(guān)于opencv的應用教程帖子基本是停留在打開圖片,提取像素重新寫入圖片啊之類的基本操作,我是要取圖片中的特定區(qū)域再提取它的像素值,作為一個初學者開始接觸opencv簡直一臉懵,慢慢摸索著知道了opencv的一些函數(shù)是可以實現(xiàn)的像SetImageROI()函數(shù)設(shè)置ROI區(qū)域,即感興趣區(qū)域,就很好用啊,總之最后是實現(xiàn)了自己想要的功能?,F(xiàn)在看個程序確實是有點挫,也有好多多余的沒必要的代碼,但畢竟算一次碼代碼的歷程,就原模原樣貼在這里吧。
代碼功能:在python下用opencv
- 打開圖片并顯示并重新寫入新的文件
- 提取圖片特定區(qū)域的像素值(根據(jù)自己需求,下面在代碼中注解)
- 對提取出來的像素值做處理用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個像素的一個區(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)
# 對box區(qū)域進行循環(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個值,即每行的像素信息
pixel_sum = np.sum(pixel_list_np_2, axis=1)
# 取消設(shè)置
cv.ResetImageROI(lwpImg)
# 畫目標區(qū)域
lwpImg = cv.Rectangle(lwpImg, (390, 0), (425, 576), (0, 255, 0), 2)
# 顯示圖像
cv.ShowImage('test1', lwpImg)
# 查看列表list長度,以確定像素值提取準確
list_length = len(pixel_list)
print list_length
# 查看數(shù)組維度,shape驗證
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()
補充:這個代碼雖然實現(xiàn)了我需要的功能,之后在對視頻流做同樣像素值提取處理并繪圖的時候,意識到圖片本就是數(shù)組形式,對于8位灰度圖,通道數(shù)為1,它就是個二位數(shù)組,這樣就沒有必要再設(shè)置ROI區(qū)域,復制出來這塊區(qū)域再循環(huán)提取像素存入數(shù)組進行處理了,可以直接將圖片存入數(shù)組,再利用numpy進行相應的數(shù)組操作就可以了,這樣一想就簡單很多了,下篇會寫對數(shù)據(jù)流的處理,直接讀取視頻文件或直接從內(nèi)存取攝像頭的視頻流進行處理,未完待續(xù)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python bluetooth藍牙信息獲取藍牙設(shè)備類型的方法
這篇文章主要介紹了python bluetooth藍牙信息獲取藍牙設(shè)備類型的方法,具體轉(zhuǎn)化方法文中給大家介紹的非常詳細,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
python實現(xiàn)局域網(wǎng)內(nèi)實時通信代碼
今天小編就為大家分享一篇python實現(xiàn)局域網(wǎng)內(nèi)實時通信代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

