close_btn
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files

##5주차 팀과제 image augmentation


##image를 변형하는 9개의 함수


#1) pooling : 원래 img의 높이와 너비보다 작은 h*w*3의 크기의 img를 반환하는 함수.


pooling <- function(img, h, w){

  height <- seq(1,nrow(img),length.out=h) # seq 함수를 이용해 원하는 길이만큼, 일정한 간격으로 출력

  width <- seq(1,ncol(img),length.out=w)

  img <- img[height,width,]

  return(img)

}


#2) shift : img를 cord 즉, c(y,x)를 받아 아래로 y필셀, 오른쪽으로 x 픽셀만큼 이동시키고 밀린 부분은 검은색으로 만들어 반환하는 함수


shift <- function(img, cord){

  new_img<-array(0,dim=c(1000,1000,3)) # (1000,1000,3)인 array 생성

  for(i in 1:nrow(img))

  {

    new_img[(500+i+cord[1]),seq((500+cord[2]),length.out=ncol(img)),] <-img[i,,]

    # 새로운 array의 가운데를 중심으로, 좌표를 이동시켜 복사

  }

  return(new_img[seq(500,length.out=nrow(img)),seq(500,length.out=ncol(img)),])

  # 가운데를 중심으로 출력한다

}


#3) brightness : br만큼 밝아진 img를 반환하는 함수 


brightness <- function(img, br){

  img<-img+br # 입력받은 밝기(br)만큼

  img<-ifelse(img>1,1,img) # 1이 넘으면 error 발생하므로 1보다 큰 값은 1로 변경 

  img<-ifelse(img<0,0,img) # 0보다 작은값은 0으로 변경

  return(img)

}


#4) rotate : angle만큼 시계방향으로 회전한 이미지를 반환시키는 함수


rotate <- function(img, angle){

  new_img<-array(0,dim=c(dim(img)[2],dim(img)[1],dim(img)[3])) # img와 같은 크기의 array 생성

  for(i in 1:nrow(img))

  {

    new_img[,i,]<-img[ncol(img)-(i-1),,] # img를 90도로 돌리려면 행부터 채워졌던 img가 열부터 채워지면 된다

  }

  if(angle==90){return(new_img)}

  else if(angle==180){(rotate(new_img,90))} # 180도는 90도 돌리는 함수를 두번 실행

  else if(angle==270){(rotate(new_img,180))} # 270도는 90도 돌리는 함수를 세번 실행

}


#5) crop : img에서 y, x축에 평행하고 두 점(sy, sx), (ey, ex)를 이은 선을 대각선으로 가지는 직사각형의 내 속한 이미지를 반환하는 함수


crop <- function(img, sy, sx, ey, ex){

  new_img<-img[sort(sy:ey),sort(sx:ex),] #sy와 ey, sx와 ex 중 어떤 것이 더 클지 모르므로 sort해준다

  return(new_img)

}


#6) resizing : 원래 img를 h*w*3의 크기의 img로 바꾸어 반환하는 함수

resizing <- function(img, h, w){
  ih <- nrow(img)
  iw <- ncol(img)
  ret <- function(mat, i, j){
    if(i < 1) i <- 1
    if(j < 1) j <- 1
    if(as.integer(i) == i && as.integer(j) == j){
      return(mat[i,j])
    }
    if(as.integer(i) != i && as.integer(j) == j){
      a <- i - as.integer(i)
      i <- as.integer(i)
      return(mat[i,j] * (1-a) + mat[i+1,j] * a)
    }
    if(as.integer(i) == i && as.integer(j) != j){
      a <- j - as.integer(j)
      j <- as.integer(j)
      return(mat[i,j] * (1-a) + mat[i,j+1] * a)
    }
    if(as.integer(i) != i && as.integer(j) != j){
      ai <- i - as.integer(i)
      i <- as.integer(i)
      aj <- j - as.integer(j)
      j <- as.integer(j)
      return((mat[i,j] * (1-aj) + mat[i,j+1] * aj)/2 + (mat[i,j] * (1-ai) + mat[i+1,j] * ai)/2)
    }
  }
  rimg <- array(0, c(h, w, 3))
  hh <- h / ih
  ww <- w / iw
  for(k in 1:3){
    for(i in 1:h){
      for(j in 1:w){
        rimg[i,j,k] <- ret(img[,,k], i/hh, j/ww)
      }
    }
  }
  return(rimg)
}

#7) gray_scale : 흑백이미지로 변환해주는 함수

gray_scale <- function(img){
  new_img<-(ori_img[,,1]+ori_img[,,2]+ori_img[,,3])/3
  ##RBG값들을 모두 더해준 후 3으로 나누어준 값(평균)을 통해 흑백으로 만들어준다.
  ##각 차원들을 뽑아내주기 위해[,,차원]
  return(new_img)
}

#8) RGB : R,G, B의 비율을 변경하여 반환하는 함수

RGB <- function(img, R, G, B){
  RGB_vec <- c(R,G,B)
  for(i in 1:3){
    img[,,i]<-img[,,i]*RGB_vec[i] ##i에 1,2,3번째 값들을 for문으로 반복해서 돌려주어서 
  }                              ##img안에 R,G,B가 1인 값들을 곱해준다. 이미지는 그대로 있고 색만 변하게 됨
  return(img)
}

#9) filtering :  3 by 3 matrix형태의 filter를 받아서 image에 필터링하여 반환해주는 함수

filtering <- function(image, filter){
  # 원본 이미지 높이와 너비 
  h <- dim(image)[1]
  w <- dim(image)[2]
  # filter가 3x3 배열이므로 필터 배열에 곱해줄 원래 이미지에서 뽑아오는 배열(3x3) 만들기
  ori_image <- matrix(rep(0,9),3)
  # 필터링된 결과 저장할 result 만들기
  result <- array(0, c(h-2, w-2,3))
  
  for(d in 1:3){         # RGB 3차원이므로 3번 for문 돌리기
    input <- image[,,d]  # input은 원래 이미지의 R,G,B 순서대로 가져온 것
    for(i in 2:(h-1)){   # 원래 배열에서 필터링할 3x3 배열 하나하나 모두 뽑아오기(부분배열)
      for(j in 2:(w-1)){
        ori_image <- input[(i-1):(i+1),(j-1):(j+1)]
        # 필터링 배열 곱해주기(필터링하기)
        result[i-1,j-1,d] <- sum(ori_image*filter)
        
        # 값이 음수이거나 1보다 큰 값일 때 처리하기
        if(result[i-1,j-1,d] > 1){
          result[i-1,j-1,d] <- 1
        }else if(result[i-1,j-1,d] < 0){
          result[i-1,j-1,d] <- 0
        }
      }
    }
  }
  return(result)
}


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 13222
92 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 김민정 민정e 2017.09.23 235
91 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 최서현 최서현 2017.09.22 202
90 투빅스 7&8기 7주차 과제 유기동물 과제 - 8기 조양규 dial123 2017.09.14 308
89 투빅스 7&8기 7주차 과제 유기동물입양예측 - 8기 김강열 김강열 2017.09.14 325
88 투빅스 7&8기 6주차 과제 word2vec - 8기 황다솔 다솔 2017.08.31 478
87 투빅스 7&8기 6주차 과제 TF-IDF 문서유사도 측정 - 8기 최서현 최서현 2017.08.31 366
86 투빅스 7&8기 5주차 과제 Selenium Crawling - 8기 김강열 김강열 2017.08.24 506
» 투빅스 7&8기 5주차 과제 Image Augmentation - 8기 김민정 김소희 최수정 황다솔 file 민정e 2017.08.24 458
84 투빅스 7&8기 5주차 과제 Beautiful Soup 이용한 Crawling - 8기 류호성 file 류호성 2017.08.24 456
83 투빅스 7&8기 4주차 과제 tree, RF, bagging, boosting 이용 분석 - 8기 조양규 file dial123 2017.08.17 510
82 투빅스 7&8기 4주차 과제 의사결정나무&랜덤포레스트 - 8기 김강열 김강열 2017.08.17 514
81 투빅스 7&8기 3주차 과제 클러스터링 구현 - 8기 권문정 김강열 이현경 조양규 1 이현경 2017.08.10 571
80 투빅스 7&8기 3주차 과제 PCA - 8기 이현경 file 이현경 2017.08.12 560
79 투빅스 7&8기 2주차 과제 연관성 분석 - 8기 조양규 file dial123 2017.08.03 571
78 투빅스 7&8기 2주차 과제 나이브베이즈 구현 - 8기 이현경 file 이현경 2017.08.03 531
77 투빅스 7&8기 2주차 과제 로지스틱/Ridge/Lasso&알고리즘 - 8기 김강열 file 김강열 2017.08.03 626
76 투빅스 7&8기 1주차 과제 알고리즘 - 8기 김강열 file 김강열 2017.07.27 672
75 투빅스 7&8기 1주차 과제 회귀분석 - 8기 황다솔 file 다솔 2017.07.27 820
74 투빅스 6&7기 8주차 과제 PCA(주성분 분석) - 7기 이동수 1 탱탱볼 2017.03.18 1679
73 투빅스 6&7기 8주차 과제 LBP 알고리즘 구현 - 7기 이광록 1 file 2017.03.16 1423
Board Pagination ‹ Prev 1 2 3 4 ... 5 Next ›
/ 5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5