2017-08-13 8 views
1

私はシングルフレームのグレースケール画像を持っています。私はある値のすべてのピクセルが赤くなるように画像を修正したいと思います。明らかに、私は画像を3フレーム画像に変換する必要があります。 私は便宜のためにEBImageパッケージを使用していますが、基本パッケージのみを使用した簡単なコードは素晴らしいでしょう。シングルフレームのグレースケール画像に色要素を追加する

mat = round(matrix(runif(100), ncol = 5), digits = 1) 
mat 
     [,1] [,2] [,3] [,4] [,5] 
[1,] 0.1 0.2 0.6 0.1 0.8 
[2,] 0.1 0.3 0.4 0.5 0.6 
[3,] 0.6 0.3 0.8 0.8 0.5 
[4,] 0.5 0.9 0.7 0.3 0.2 
[5,] 0.7 0.7 0.9 0.3 0.2 
[6,] 0.6 1.0 0.4 0.7 0.3 
[7,] 0.7 0.6 0.5 0.8 0.5 
[8,] 0.4 0.8 0.2 0.2 0.1 
[9,] 0.2 0.1 0.4 0.9 0.6 
[10,] 0.7 0.3 0.2 0.3 0.8 
[11,] 0.8 1.0 0.4 0.8 0.3 
[12,] 0.8 1.0 0.5 0.8 0.7 
[13,] 0.6 0.5 0.9 0.9 0.1 
[14,] 1.0 0.5 0.6 0.0 0.3 
[15,] 0.1 0.5 0.6 0.6 0.2 
[16,] 0.2 0.8 0.2 0.5 0.2 
[17,] 0.9 0.9 0.4 0.7 0.1 
[18,] 0.3 0.7 0.9 0.7 0.4 
[19,] 1.0 0.0 0.5 0.0 1.0 
[20,] 0.2 0.3 0.9 0.3 0.6 

matgray = 255*mat 
mat_rgb = channel(matgray, 'rgb') ## using EBImage package 
dim(mat_rgb) 
[1] 20 5 3 
mat_red = channel(mat_rgb, 'asred') 

# To generate and save gray image from gray matrix 
par(mar = c(0,0,0,0)) 
png(filename = paste("Image.png"), res=1) 
image(mat_red, axes = FALSE) 
dev.off() 

私は画像を保存するために行く、それはMissing frame index for an image stack, assuming 'i = 1'を言うと、画像は実際には任意の赤を表示しません...任意の助けをありがとう!

答えて

1

ほとんど正しいです。 channel(mat, 'rgb')またはそのエイリアス機能toRGB(mat)は、赤、緑、および青のカラーチャネル上のピクセル強度を複製して3D配列を生成することによって、単一のグレースケールフレームをRGBイメージにプロモートします。デフォルトでは、EBImageは[0:1]の範囲の画像データで動作するため、通常は行列に255を乗算しません。 displayを使用してデータを視覚化することができます。

library(EBImage) 
set.seed(0) # set random number generator state for reproducibility 

mat <- round(matrix(runif(100), ncol = 5), digits = 1) 
mat_rgb <- channel(mat, 'rgb') #or: toRGB(mat) 
mat_rgb 

## Image 
## colorMode : Color 
## storage.mode : double 
## dim   : 20 5 3 
## frames.total : 3 
## frames.render: 1 
## 
## imageData(object)[1:5,1:5,1] 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] 0.9 0.8 0.4 0.4 1.0 
## [2,] 0.3 0.9 0.8 0.9 0.4 
## [3,] 0.4 0.2 0.6 0.3 0.7 
## [4,] 0.6 0.7 0.8 0.5 0.4 
## [5,] 0.9 0.1 0.6 0.3 0.3 

display(mat_rgb) 

enter image description here

しかし、画像のcolorModeは、各ピクセルの色強度が3つのチャネルにわたって同一であるため、結果はまだ灰色の色合いに表示Colorであるにもかかわらず。 channel(mat_rgb, 'asred')は、その値をコピーすることによってグレースケール原形から生成された赤色成分のみを抽出する。したがって、あなたはあなたが始まったのと同じフレームを持つことになります。

mat_red <- channel(mat_rgb, 'asred') 
mat_red 

## Image 
## colorMode : Grayscale 
## storage.mode : double 
## dim   : 20 5 
## frames.total : 1 
## frames.render: 1 
## 
## imageData(object)[1:5,1:5] 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] 0.9 0.8 0.4 0.4 1.0 
## [2,] 0.3 0.9 0.8 0.9 0.4 
## [3,] 0.4 0.2 0.6 0.3 0.7 
## [4,] 0.6 0.7 0.8 0.5 0.4 
## [5,] 0.9 0.1 0.6 0.3 0.3 

identical(imageData(mat_red), mat) #or: identical(as.array(mat_red), mat) 

## [1] TRUE 

あなたrgbImageredチャネルとしてグレースケール行列を用いて、赤色の全ての画素を着色することができます。

mat_red <- rgbImage(red = mat) 

display(mat_red) 

enter image description here

グレースケール画像の残りの部分を残しながら、特定の基準を満たす画素のみを強調するための固定色を使用するためには、赤、緑、青のように、元の強度マトリックスを提供するために必要チャネルをrgbImageに変更するが、所望の色を符号化するように変更されている。たとえば、しきい値が0.2赤のすべてのピクセルを赤に塗りつぶす場合は、赤のチャンネルでは(最大カラー値)に設定し、他の2つの場合は0に設定します。他の色に対応

pts <- which(mat<0.2) 

mat_r <- mat_g <- mat_b <- mat 
mat_r[pts] <- 1 
mat_g[pts] <- 0 
mat_b[pts] <- 0 

display(rgbImage(mat_r, mat_g, mat_b)) 

enter image description here

値は容易col2rgbから得ることができます。

col2rgb("orange")/255 

##   [,1] 
## red 1.0000000 
## green 0.6470588 
## blue 0.0000000 
+0

ありがとう、それは素晴らしいですね。しかし、私はこれが私がやろうとしていることではないと確信しています。あなたが提案するものは、明暗のコントラストを保ちながら、すべてのピクセルを赤で色付けします。私が望むのは、ほとんどのピクセルをグレイスケールで保持し、グレイスケール値が0であるすべてのピクセルを赤に変更することです。その結果、そこには赤いピクセルが少し浮かぶグレースケールの画像になります。 – Gabriel123

+0

私はそれに応じて答えを更新しました。 – aoles

+0

おなかがありがとう、それはうまく動作します:-) – Gabriel123

関連する問題