2013-12-18 2 views
2

JPEG 이미지의 채널 평균 방법 : 픽셀 평균을내가 R에 이미지를 업로드

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

을하고 난 루프를 썼다 그러나

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) 
      }} 

을 내 출력은 모든 것. 내가 들어가서 수동으로 값을 얻으려고한다면 .8 또는 .9 뭔가 다. 그래서 나는 r이 모든 것을 1로 반올림한다고 생각하지만 그렇게하지 못하게하는 방법을 생각할 수는 없다. 어떤 제안? IMG가 배열 구조는 또는 1로 변환 할 수 있다고 가정

답변

1

이, 이것은 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) 

원하는 것을 수행합니다.

+0

정말 고마워요! 각 열의 각 픽셀의 평균을 저장 한 다음 각 열이 다른 그림이되도록 행렬을 만들어야합니다. m [k,] <- (img [i, j, 1] + img [i, j, 2] + img [i, j, 3])/3)을 어떻게 수정할 수 있는지 말해 줄 수 있나요? 이미지 (1,2, ...)이고 열은 각 픽셀의 평균을 나열합니까? – user3116677

+1

내가 제공 한 코드를 사용하십시오. 한 줄의 행렬 (Rowmeans (... 정확히 한 이미지에 대해 그렇게하고 있습니다. 그 루프가 필요 없습니다. 사실, R에 루프가 필요 없습니다.) 읽으십시오 : http : // www. burns-stat.com/pages/Tutor/R_inferno.pdf Circle 3 –

+0

Wonderful! 고맙습니다. – user3116677