【问题标题】:How to average the channels of a jpeg image如何平均 jpeg 图像的通道
【发布时间】:2013-12-18 19:59:46
【问题描述】:

我将图片上传到 r:

img=readJPEG("18105_552.jpg", native = FALSE)

我写了一个for循环来平均像素:

options(digits=15)
m=matrix(data=NA, nrow=1, ncol=230400)
for(k in 1)
    for (i in (1: 480)){
          for (j in (1: 480)){
           m[k, ]<-((img[i,j,1]+img[i,j,2]+img[i,j,3])/3) 
            }}

但是,我的输出都是 1。如果我进入并手动尝试获取值,它们都是 0.8 或 0.9 的东西,所以我认为 r 正在将所有内容四舍五入到 1,但我似乎无法弄清楚如何阻止它这样做。有什么建议吗?

【问题讨论】:

    标签: arrays r image average


    【解决方案1】:

    假设 img 是一个数组结构或可以转换为一个,这可以在没有显式循环的情况下使用rowMeans()

    img <- array(runif(30,0.6,1),dim=c(10,10,3))
    rowMeans(img,dims=2)
    

    或者,把它排成一行:

    matrix(rowMeans(img,dims=2),nrow=1)
    

    这会按列存储数字。使用byrow=TRUE 逐行填写。在正确的结果旁边,您将获得相当大的加速。

    顺便说一句,你的问题不是四舍五入。您的解决方案不起作用的原因是以下步骤:

    m[k, ]<-((img[i,j,1]+img[i,j,2]+img[i,j,3])/3) 
    

    在这里您计算一个数字,但将其分配给矩阵m 的第 k 行。 R 将回收单个数字,并用该单个数字填充整行。这个数字将是您计算的最后一个数字,在您的情况下可能是 1。


    编辑:

    要对一组图片执行此操作,请将它们存储在列表中并使用 sapply 为您完成工作:

    说:

    img <- array(runif(30,0.6,1),dim=c(10,10,3))
    img2 <- array(runif(30,0.6,1),dim=c(10,10,3))
    

    然后列个清单:

    images <- list(img,img2)
    names(images) <- c('img1','img2')
    

    还有:

    m <- sapply(images,rowMeans,dims=2)
    

    做你想做的。

    【讨论】:

    • 非常感谢!我需要制作一个矩阵,以便它将每个像素的平均值存储在一列中,然后每一列将是一张不同的图片。你能告诉我如何修改 m[k, ]
    • 使用我为您提供的代码。单行矩阵(Rowmeans(... 正在为一张图像执行此操作。不需要该循环。事实上,R 中几乎不需要循环...阅读此内容:burns-stat.com/pages/Tutor/R_inferno.pdf Circle 3。
    • 太棒了!非常感谢!
    猜你喜欢
    • 2014-02-15
    • 2017-10-02
    • 1970-01-01
    • 2021-04-04
    • 2018-06-08
    • 2012-12-30
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多