溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python+OpenCV圖片局部區(qū)域像素值處理的示例分析

發(fā)布時(shí)間:2021-06-11 14:35:19 來源:億速云 閱讀:764 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python+OpenCV圖片局部區(qū)域像素值處理的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

背景故事:我需要對(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)了自己想要的功能。現(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()

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python+OpenCV圖片局部區(qū)域像素值處理的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI