2017-07-08 1 views
1

私はImageからRGB値を差し引く必要があるプロジェクトで作業しています。例では、REDからBLUEチャンネルを減算したいので、REDは減算の差分値を取得します。
外形寸法:1456x2592、 BPP:PythonのImageからRGB値を減算する

[[[ 63 58 60] 
    [ 63 58 60] 
    [ 64 59 61] 
     ..., 
    [155 155 161] 
    [155 155 161] 
    [155 155 161]] 

    [[ 58 53 55] 
     [ 60 55 57] 
     [ 62 57 59] 
     ..., 
     [157 157 163] 
     [157 157 163] 
     [158 158 164]] 

私はそれらを知っている:3

私が使用している画像は、私に次のようaraysを与える

私は画像の次の性質を持っています画像からの値(RGB)が、今私は(次のサイトから、このコードに基づいて、I)コードhttps://pythonspot.com/en/tag/opencv/

import cv2 
import numpy as np 
from PIL import Image 

# read image into matrix. 
m = cv2.imread("ITESO.jpeg") 


# get image properties. 
h,w,bpp = np.shape(m) 

# iterate over the entire image. 
# BLUE = 0, GREEN = 1, RED = 2.  

for py in range(0,h): 
    for px in range(0,w): 
     #m[py][px][2] = 2 
     n = m[py][px][2]    //n takes the value of RED 
     Y = [n, 0, 0]     //I create an array with [RED, 0, 0] 
     m, Y = np.array(m), np.array(Y) 
     m = np.absolute(m - Y)  //Get the matriz with the substraction 


y = 1 
x = 1 
print (m) 
print (m[x][y]) 

#display image 
#cv2.imshow('matrix', m) 
#cv2.waitKey(0) 
cv2.imwrite('new.jpeg',m) 
img = Image.open('new.jpeg') 
img.show() 

img = Image.open('new.jpeg').convert('L') 
img.save('new_gray_scale.jpg') 
img.show() 
を行うために移動します

私はJのマトリズを印刷するとき、それは次のアレイ与える:

B、G、R

ブルー= BLUE - RED

[[[ 3 58 60] 
    [ 3 58 60] 
    [ 4 59 61] 
    ..., 
[ 95 155 161] 
[ 95 155 161] 
[ 95 155 161]] 

[[ 2 53 55] 
[ 0 55 57] 
[ 2 57 59] 
..., 
[ 97 157 163] 
[ 97 157 163] 
[ 98 158 164]] 

をしかし、私は新しいイメージを開くことaboleありませんよ1つのRGBチャンネルを1つの値に設定すると、画像が表示されます。私はそのために、次の行を使用します。私は、互いからRGBチャンネルを引くことができる方法があるかどう

import cv2 
import numpy as np 

# read image into matrix. 
m = cv2.imread("python.png") 

# get image properties. 
h,w,bpp = np.shape(m) 

# iterate over the entire image. 
for py in range(0,h): 
    for px in range(0,w): 
     m[py][px][0] = 0 //setting channel Blue to values of 0 

# display image 
cv2.imshow('matrix', m) 
cv2.waitKey(0) 

誰もが知っているのですか?私はもう何をすべきかわからない、私は立ち往生している、誰かが私を助けたら本当に感謝するだろう。

P.D. MatLabでは魅力的に機能しますが、私はPythonでそれを行うことができません。

+0

コードゼロにRGB負の値を操作します...それらの部分を行い、それらを再度マージします。 [Here](http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#splitting-and-merging-image-channels)は、分割またはマージする方法です。しかし、diff = brのように好きなだけお互いを差し引いてから、 – api55

+0

私に返信していただきありがとうございます。実際にはイメージをフォルダに保存していました。 img.showは何らかの理由で動作しません。ありがとう。 –

答えて

2

この操作では、マトリックス(画像)のdtypeuint8からint32に変更されており、これによりその他のproblemsが発生する可能性があるので注意してください。これを行うには良い方法(そしてより効率的な)は、IMO、このです:

import cv2 
import numpy as np 

img = cv2.imread('image.png').astype(np.float) # BGR, float 
img[:, :, 2] = np.absolute(img[:, :, 2] - img[:, :, 0]) # R = |R - B| 
img = img.astype(np.uint8) # convert back to uint8 
cv2.imwrite('new-image.png', img) # save the image 
cv2.imshow('img', img) 
cv2.waitKey() 
+0

それは完全に機能し、私は "np.absolute"を "np.array"に切り替えたので、負の値を参照してゼロの値に変換することができました。例えばR(40)、B(60)R = R-B = -20。私の前のコードでは、 "if"条件を使用して、これらの負の値を0ピクセルに変換しました。しかし、私はこのコードでそれを行う方法を見つけることができません。あなたはそれを行う簡単な方法を知っていますか?....私は、コードの一部を投稿するために私自身の質問に答えるでしょう:) –

+0

@AndresMitreはい、 'img [:,:、2] = np.clip( img [:,:、2] - img [:,:、0]、0.0、255.0) '。 – Berriel

+0

うわー、それは魅力のように機能します!それは私が思ったより簡単だった、あなたは仕事の時間を節約しました、ありがとうございました。 –

0

あなたは常にスプリット機能を使用してチャネルを分離することができます

m = cv2.imread("img.jpg") 

# get image properties. 
h,w,bpp = np.shape(m) 

    # iterate over the entire image. 
    # BLUE = 0, GREEN = 1, RED = 2. 

    for py in range(0,h): 
     for px in range(0,w): 
      n = m[py][px][1] 
      Y = [0, 0, n] 
      m, Y = np.array(m), np.array(Y) 
      a = (m - Y) 
      if (a[py][px][0] <=0): #if Blue is negative or equal 0 
       a[py][px][0] = 0 #Blue set to 0 
    cv2.imwrite('img_R-G.jpg',a) 
    img = Image.open('img_R-G.jpg').convert('L') 
    img.save('img_R-G_GS.jpg') 
関連する問題