1. 程式人生 > >Python-OpenCV 處理影象(三):影象畫素點操作

Python-OpenCV 處理影象(三):影象畫素點操作

https://segmentfault.com/a/1190000003742442

0x01. 畫素

有兩種直接操作圖片畫素點的方法:

第一種辦法就是將一張圖片看成一個多維的list,例如對於一張圖片im,想要操作第四行第四列的畫素點就直接 im[3,3] 就可以獲取到這個點的RGB值。

第二種就是使用 OpenCV 提供的 Get1D、 Get2D 等函式。

推薦使用第一種辦法吧,畢竟簡單。

0x02. 獲取行和列畫素

有一下四個函式:

  • cv.GetCol(im, 0): 返回第一列的畫素

  • cv GetCols(im, 0, 10): 返回前 10 列

  • cv.GetRow(im, 0): 返回第一行

  • cv.GetRows(im, 0, 10): 返回前 10 行

0x03. 批量處理

需要批量處理所有的畫素點的時候,只需要使用for迴圈迭代處理就可以了:

import cv2.cv as cv

im = cv.LoadImage("img/lena.jpg")

for i in range(im.height):
    for j in range(im.width):
        im[i,j] # 這裡可以處理每個畫素點

還有一種迭代處理的方式是使用 LineIterator,不過在宣告 LineIterator 的時候需要制定處理畫素點的開始點和結束點。

import cv2.cv as cv

im = cv.LoadImage("img/lena.jpg"
) li = cv.InitLineIterator(im, (0, 0), (im.rows, im.cols)) #So loop the entire matrix for (r, g, b) in li: # 這裡可以對每個畫素點的 r g b 進行處理

娛樂一下, 隨機獲取 5000 個畫素點,然後把顏色換成一個隨機的值(salt):

import cv2.cv as cv

import random

# 這裡也可以使用 Get2D/Set2D 來載入圖片
im = cv.LoadImage("img/lena.jpg") 

for k in range(5000): #Create 5000 noisy pixels
i = random.randint(0,im.height-1) j = random.randint(0,im.width-1) color = (random.randrange(256),random.randrange(256),random.randrange(256)) im[i,j] = color cv.ShowImage("Noize", im) cv.WaitKey(0)

效果圖: