Python+OpenCV圖片局部區(qū)域像素值處理詳解
背景故事:我需要對一張圖片做一些處理,是在圖像像素級別上的數(shù)值處理,以此來反映圖片中特定區(qū)域的圖像特征,網(wǎng)上查了很多,大多關(guān)于opencv的應(yīng)用教程帖子基本是停留在打開圖片,提取像素重新寫入圖片啊之類的基本操作,我是要取圖片中的特定區(qū)域再提取它的像素值,作為一個初學(xué)者開始接觸opencv簡直一臉懵,慢慢摸索著知道了opencv的一些函數(shù)是可以實(shí)現(xiàn)的像SetImageROI()函數(shù)設(shè)置ROI區(qū)域,即感興趣區(qū)域,就很好用啊,總之最后是實(shí)現(xiàn)了自己想要的功能?,F(xiàn)在看個程序確實(shí)是有點(diǎ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ū)域進(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個值,即每行的像素信息
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ǔ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ǔ)充:這個代碼雖然實(shí)現(xiàn)了我需要的功能,之后在對視頻流做同樣像素值提取處理并繪圖的時候,意識到圖片本就是數(shù)組形式,對于8位灰度圖,通道數(shù)為1,它就是個二位數(shù)組,這樣就沒有必要再設(shè)置ROI區(qū)域,復(fù)制出來這塊區(qū)域再循環(huán)提取像素存入數(shù)組進(jìn)行處理了,可以直接將圖片存入數(shù)組,再利用numpy進(jìn)行相應(yīng)的數(shù)組操作就可以了,這樣一想就簡單很多了,下篇會寫對數(shù)據(jù)流的處理,直接讀取視頻文件或直接從內(nèi)存取攝像頭的視頻流進(jìn)行處理,未完待續(xù)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Windows環(huán)境下如何使用Pycharm運(yùn)行sh文件
這篇文章主要介紹了Windows環(huán)境下如何使用Pycharm運(yùn)行sh文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
python?爬取豆瓣電影短評并利用wordcloud生成詞云圖
這篇文章主要介紹了python?爬取豆瓣電影短評并利用wordcloud生成詞云圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06

