R:将RGB图像的红色和绿色值设置为零,方法是将其作为矩阵处理
我正在使用OpenImageR和超级像素图像分割软件包。 我想提取分割图像的绿色维度,结果是二维图像而不是3(灰度)。R:将RGB图像的红色和绿色值设置为零,方法是将其作为矩阵处理,r,matrix,grayscale,R,Matrix,Grayscale,我正在使用OpenImageR和超级像素图像分割软件包。 我想提取分割图像的绿色维度,结果是二维图像而不是3(灰度)。 因此,为了给它着色,我将彩色图像的红色和蓝色值设置为0。 但是,每当我尝试显示图像时,我都会出现以下错误,我无法理解为什么0被大胆地定义为NAN,我还尝试将其设置为优于零(0.01)的值,但我仍然会收到相同的消息: Error in rgb(t(x[, , 1L]), t(x[, , 2L]), t(x[, , 3L]), maxColorValue = max) : c
因此,为了给它着色,我将彩色图像的红色和蓝色值设置为0。
但是,每当我尝试显示图像时,我都会出现以下错误,我无法理解为什么0被大胆地定义为NAN,我还尝试将其设置为优于零(0.01)的值,但我仍然会收到相同的消息:
Error in rgb(t(x[, , 1L]), t(x[, , 2L]), t(x[, , 3L]), maxColorValue = max) :
color intensity nan, not in [0,1]
这是我的密码:
library(SuperpixelImageSegmentation)
library(OpenImageR)
path = system.file("tmp_images", "Phen.jpg", package = "OpenImageR")
image = readImage(path)
init = Image_Segmentation$new()
segmentation = init$spixel_segmentation(input_image = image,
superpixel = 2000, # k
AP_data = TRUE,
use_median = TRUE,
sim_wA = 5,
sim_wB = 5,
sim_color_radius = 3,
kmeans_method = "kmeans",
kmeans_initializer = "kmeans++",
kmeans_num_init = 5,
kmeans_max_iters = 50,
verbose = TRUE)
#getting the green part alone
imG = segmentation$AP_image_data
imG = imG[,,2]
imB = segmentation$AP_image_data
imB = imB[,,3]
imR = segmentation$AP_image_data
imR = imR[,,1]
imR4 = imR / 2
imB4 = imB / 2
imGDone = imG - imR4
imGDone = imGDone - imB4
imageShow(imGDone) # works fine, the result is a mask that contains only the green concentrated areas
imGColor <- segmentation$AP_image_data
for (i in 1:nrow(imGDone)) {
for (j in 1:ncol(imGDone)){
if (imGColor[i,j,1] > 0) {
imGColor[i,j,1] = 0 * imGDone[i,j] # setting red to zero
imGColor[i,j,3] = 0 * imGDone[i,j] # setting blue to zero
imGColor[i,j,2] = 1 * imGDone[i,j] # setting green
}
}
}
imageShow(imGColor)
库(超级像素图像分割)
图书馆(OpenImageR)
path=system.file(“tmp_images”,“Phen.jpg”,package=“OpenImageR”)
image=readImage(路径)
init=图像分割$new()
segmentation=init$spixel\u segmentation(输入图像=图像,
超级像素=2000,#k
AP_数据=真,
使用中位数=真,
sim_wA=5,
sim_wB=5,
模拟颜色半径=3,
kmeans\u method=“kmeans”,
kmeans_初始值设定项=“kmeans++”,
kmeans_num_init=5,
kmeans\u max\u iters=50,
详细=正确)
#单独获取绿色部分
imG=分割$AP\u图像\u数据
imG=imG[,2]
imB=分割$AP\U图像\U数据
imB=imB[,3]
imR=分割$AP\U图像\U数据
imR=imR[,1]
imR4=imR/2
imB4=imB/2
imGDone=imG-imR4
imGDone=imGDone-imB4
imageShow(imGDone)#工作正常,结果是一个仅包含绿色集中区域的遮罩
imGColor(0){
imGColor[i,j,1]=0*imGDone[i,j]#将红色设置为零
imGColor[i,j,3]=0*imGDone[i,j]#将蓝色设置为零
imGColor[i,j,2]=1*imGDone[i,j]#设置为绿色
}
}
}
图像显示(imGColor)
当我执行最后一行显示imGColor时,我得到了错误。
我是R的新手,我找不到任何线索来说明可能的原因。
因此,我想在我应该做的事情上得到帮助,并提前向您表示感谢 这实际上不是“超级像素图像分割”或“OpenImageR”问题。“OpenImageR”软件包的“imageShow”功能在引擎盖下使用该功能。您收到的错误是由于R、G、B的修改值不在0和1之间的范围内,如另一篇文章中所述。要克服这个问题,您必须首先将像素值标准化为[0,1],然后进行调整。您提到的文件的“路径”在“OpenImageR”包中不存在,因此我使用了该包的另一个可用图像
library(SuperpixelImageSegmentation)
library(OpenImageR)
path = system.file("tmp_images", "2.jpg", package = "OpenImageR")
image = readImage(path)
init = Image_Segmentation$new()
segmentation = init$spixel_segmentation(input_image = image,
superpixel = 2000, # k
AP_data = TRUE,
use_median = TRUE,
sim_wA = 5,
sim_wB = 5,
sim_color_radius = 3,
kmeans_method = "kmeans",
kmeans_initializer = "kmeans++",
kmeans_num_init = 5,
kmeans_max_iters = 50,
verbose = TRUE)
#getting the green part alone
imG = segmentation$AP_image_data
imG = imG[,,2]
imB = segmentation$AP_image_data
imB = imB[,,3]
imR = segmentation$AP_image_data
imR = imR[,,1]
imR4 = imR / 2
imB4 = imB / 2
imGDone = imG - imR4
imGDone = imGDone - imB4
imageShow(imGDone) # works fine, the result is a mask that contains only the green concentrated areas
# the 'imGDone' array has values in the range [-0.08039, -0.03824]
summary(as.vector(imGDone))
# you have to normalize first to [0,1] to avoid the error
imGDone <- OpenImageR::NormalizeObject(imGDone)
# values now in the range [0.0000, 1.0000]
summary(as.vector(imGDone))
imGColor <- segmentation$AP_image_data
for (i in 1:nrow(imGDone)) {
for (j in 1:ncol(imGDone)){
if (imGColor[i,j,1] > 0) {
imGColor[i,j,1] = 0 * imGDone[i,j] # setting red to zero
imGColor[i,j,3] = 0 * imGDone[i,j] # setting blue to zero
imGColor[i,j,2] = 1 * imGDone[i,j] # setting green
}
}
}
imageShow(imGColor)
库(超级像素图像分割)
图书馆(OpenImageR)
path=system.file(“tmp_images”,“2.jpg”,package=“OpenImageR”)
image=readImage(路径)
init=图像分割$new()
segmentation=init$spixel\u segmentation(输入图像=图像,
超级像素=2000,#k
AP_数据=真,
使用中位数=真,
sim_wA=5,
sim_wB=5,
模拟颜色半径=3,
kmeans\u method=“kmeans”,
kmeans_初始值设定项=“kmeans++”,
kmeans_num_init=5,
kmeans\u max\u iters=50,
详细=正确)
#单独获取绿色部分
imG=分割$AP\u图像\u数据
imG=imG[,2]
imB=分割$AP\U图像\U数据
imB=imB[,3]
imR=分割$AP\U图像\U数据
imR=imR[,1]
imR4=imR/2
imB4=imB/2
imGDone=imG-imR4
imGDone=imGDone-imB4
imageShow(imGDone)#工作正常,结果是一个仅包含绿色集中区域的遮罩
#“imGDone”数组的值的范围为[-0.08039,-0.03824]
摘要(作为矢量(imGDone))
#必须先将其规格化为[0,1]以避免出现错误
imGDone