어떤 이미지에서 100 이상을 노이즈로 정의하고 이미지의 주요 특징값인 60~80의 값으로 채워 넣을땐 어떻게 해야할까?

< 일반 파이썬의 zip *을 이용한 방법 > 

# 각 이미지가 가지는 일반적인 범위
img_range = np.arange(60, 80 + 1) 

# !00 이상인 인덱스를 얻어오고
white_index = np.where(img > 100)

# 각 인덱스에 랜덤하게 (60~80) 숫자를 넣어줌.
for i, j, k in zip(*white_index):
    img[i][j][k] = np.random.choice(img_range, 1)

 

위와 같은 코드로 할 수 있다. 

하지만 2번째 코드와 3번째 코드를 보면 함수의 내부 코드까지 더해져 이중 for-loop가 남발하게 되어 속도가 매우매우 느려지게 된다.

따라서 위와같은 방법은 좋지 않은 방법이며 masking방법을 이용하여 코드 라인을 줄임과 동시에 for문의 중첩을 줄여주어야 한다.

 

< Masking 방법 > 

import numpy as np

img = np.arange(27).reshape(3, 3, 3)
index = np.arange(60, 80 + 1)
mask = np.random.choice(index, 3 * 3 * 3).reshape(3, 3, 3) 
a = np.where(a > 20, mask, img)

 

(램이 충분하다면) 이와 같이 mask를 미리 만들어두어 np.where을 사용하여 img + noise이미지를 다시 생성해주는 코드입니다.

또한, 위 코드에서는 이미지가 rgb채널일 경우를 가정하고 하였는데, mask의 크기를 3*3으로 해주어도 파이썬의 특징인 브로드캐스팅이 작동하여 정상적으로 마스킹작업이 가능해지게 됩니다. 

위와 같이 하게 된 이유는 개인적인 결정이지만, 3*3*3으로 하면 좀더 많은 난수를 생성하게 되어 노이즈 대체값(60~80)에 대해 훨씬 넓은 선택폭을 가지게 되어

좀더 좋은 결과를 가지게 되지 않을까 생각하여 그렇게 하였습니다.

(실제로 3*3을 하면 그 행렬로 rgb를 전부 채우게 되어 랜덤하게 특징값을 채우는것에 대한 의미를 퇴색시킬 수 있겠다는 생각?)

 

< 그 외 > 

그 외의 방법은 알아보진 실험해보진 못했지만

1. openCV를 활용하여 이미지를 바이너리화 한 다음 masking방법을 진행

2. cifi나 cython을 이용 ( 결국 c언어가 제일 빨라요 )

3. 2번의 방법과 함께 CUDA를 이용하여 nvidia gpu 분기 작업 이용하기

 

핵심 : list comprehension과 set.intersection 사용

중첨 리스트에서도 잘 동작



그 외에, filter + lambda(or custom function) 으로도 해결할 수 있으나, 특별한 함수를 쓰지 않을땐 이 방법이 편리


filter(function, iterable(list라던가 등등)) : 리턴값이 참인것만 묶어서 반환해줌 

파이썬 식별연산자

is : 객체 메모리의 위치나 값이 같을 경우 True

is not : 객체 메모리의 위치나 값이 같지 않을 경우 True

df1, df2가 있다고 가정.


df1은 전체 데이터이고, df2는 일부데이터 일때


df1 = pd.DataFrame({'col1':['a', 'b', 'c', 'd'], 'col2':[1,2,3,4] }) 
df2 = pd.DataFrame({'col1':['a','c']})

1. 가져오고 싶은 값이 1개일때

boolean 조건문 이용


2. 여러개일때 

DataFrame의 merge함수 이용



추가로 join함수도 생각해볼 수 있겠지만, 이 함수는 칼럼이 겹치지 않으며 완전히 같거나 유사한 색인 구조를 가진 여러 개의 DataFrame 객체를 병합할 때 사용 가능하다.




경사하강법 구현입니다.

new_value = old_value - learning_rate * old_value

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


old_value = 10
derivative = [old_value]
# basic example : x^2
y = [old_value ** 2]

learning_rate = 0.01

for i in range(1, 1000):
    # update
    new_value = old_value - learning_rate * old_value
    
    # for plotting
    y.append(new_value ** 2)
    derivative.append(new_value)
    
    old_value = new_value
    
plt.plot(derivative, y)