2016-02-02 34 views
0

我想實現一個小程序,它將隨機翻轉並引入RGB抖動/輕微的值變化。隨機翻轉和RGB抖動/圖像的輕微值變化?

並且如果可能的話,將彩色圖像中3層的抖動/微小值改變限制爲2。

import cv2 
import random 

probofflip=0.5 
probofRGBjit= 0.6 

img=cv2.imread('path/to/img.png',1) 
if (random.uniform(0,1)>1-probofflip): 
    img= cv2.flip(img,1) 
if if (random.uniform(0,1)>1-probofRGBjit): 
    #function to jitter the RGB layers 
#do something with resultant image. 
+0

迷人。你的問題是什麼?不要忘記它應該是一個最小的完整可驗證的例子,即代碼不能工作。 http://stackoverflow.com/help/mcve – barny

回答

4

如果您使用的是cv2,那麼numpy對於這類操作非常有幫助。抖動,你的意思是轉移一些像素?這個例子只涉及輕微的價值變化。

import cv2 
import numpy as np 
from pylab import * 

img = cv2.imread(r'C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg') 
img = cv2.cvtColor(img, cv2.cv.CV_BGR2RGB) # cv2 defaul color code is BGR 
h,w,c = img.shape # (768, 1024, 3) 

noise = np.random.randint(0,50,(h, w)) # design jitter/noise here 
zitter = np.zeros_like(img) 
zitter[:,:,1] = noise 

noise_added = cv2.add(img, zitter) 
combined = np.vstack((img[:h/2,:,:], noise_added[h/2:,:,:])) 

imshow(combined, interpolation='none') 

​​

如果你想通過一些像素每個顏色通道轉移,那麼你可以使用np.roll。例如:

# shift each channel by 10 pixels 
R = img[:,:,0] 
G = img[:,:,1] 
B = img[:,:,2] 
RGBshifted = np.dstack((
    np.roll(R, 10, axis=0), 
    np.roll(G, 10, axis=1), 
    np.roll(B, -10, axis=0) 
    )) 
imshow(RGBshifted)