brunch

You can make anything
by writing

C.S.Lewis

파이썬 바카라 배팅 프로세싱 (4)

워터마크 넣기

파이썬 바카라 배팅 프로세싱 (4)


4회 만에 처음으로 책(Visual C++ 영상 처리 프로그래밍)에는 없는 내용을 다뤄본다.

바카라 배팅에 워터마크 넣기! 최하위 비트에 0이라는 숫자 바카라 배팅를 넣어볼 것이다. 원본 바카라 배팅는 3회에서 사용한 바카라 배팅인camera.bmp를 그대로 사용할 것이다. 해당 바카라 배팅 최하위 비트에 원하는 정보를 넣어보자.


바카라 배팅최하위 비트에 정보를 넣어도 느껴지지 않는 차이


원본 바카라 배팅와 최하위 비트에 원하는 정보를 넣은 결과 바카라 배팅는 육안으로 봤을 때 거의 차이가 없다. 도저히 구별할 수 없는 수준이다.


실제로 어떤 작업을 수행했는지 코드를 살펴보자.

먼저 최하위 비트에 추가된 바카라 배팅는 zero.bmp라는 파일이다. 임시로 그림판으로 만든 바카라 배팅이다. camera.bmp 파일을 하나 복사한 후에 그림판으로 열어서 기존 바카라 배팅를 지우고 대충 그리면 된다. 그리기 귀찮으면 다음의 첨부파일을 다운로드하여서 사용하자.


바카라 배팅zero.bmp 바카라 배팅


if zero_바카라 배팅[i, j] == 0 이란 의미는 이미지의 그레이스케일 값이 0인 부분, 즉 zero.bmp에서 검은색 부분을 의미한다.


이때 최하위 비트를 0으로 만들어 준다. 왜냐하면 비트 평면 분할은이전 포스팅에서 사용한 것을 그대로 사용할 것이기 때문이다. 간단히 다시 설명하면 각 비트가 0이면 해당 픽셀을 0(검은색), 1이면 해당 픽셀을 255(흰색)로 설정해주는 방식이었다. 그렇기 때문에 검은색의 0이란 모양을 그대로 옮기기 위해서는 그레이스케일 값이 0일 때 최하위 비트를 0으로 설정해야 한다.


바카라 배팅


원본 이미지 정보를 담고 있는 Mat 타입인 camera_바카라 배팅의 최하위 비트만 0으로 변경하기 위해서 camera_바카라 배팅[i, j] & 254로 and 연산을 한다. 254는 2진수로 11111110이기 때문이다. 따라서 상위 7비트는 원본 그대로 보존될 것이고 최하위 비트는 모두 0으로 바뀐다.


반대로 zero.bmp에서 배경 부분은흰색으로 처리하면 된다. 따라서 최하위 비트를 1로 변경해야 한다. 그러기 위해서는원본 이미지의 그레이스케일 값이 0이 아닐 때 out_바카라 배팅[i, j] = camera_바카라 배팅[i, j] | 1과같이 하면 된다. 1은 2진수로 00000001이고 or 연산을 했기 때문에 상위 7비트는 원본 그대로 보존될 것이고 최하위 비트는 모두 1로 변경된다.



import matplotlib.pyplot as plt

import cv2

def draw_image(original_바카라 배팅, result_바카라 배팅, title, sub_title1, sub_title2):

fig = plt.figure()

fig.suptitle(title)

ax = fig.add_subplot(1, 2, 1)

ax.imshow(original_바카라 배팅, cmap=plt.cm.gray)

ax.set_title(sub_title1)

ax = fig.add_subplot(1, 2, 2)

ax.imshow(result_바카라 배팅, cmap=plt.cm.gray)

ax.set_title(sub_title2)

plt.show()

def set_watermark():

camera_바카라 배팅_path = "바카라 배팅\camera.bmp"

zero_바카라 배팅_path = "바카라 배팅\zero.bmp"

camera_바카라 배팅 = cv2.imread(camera_바카라 배팅_path, cv2.IMREAD_GRAYSCALE)

zero_바카라 배팅 = cv2.imread(zero_바카라 배팅_path, cv2.IMREAD_GRAYSCALE)

out_바카라 배팅 = camera_바카라 배팅.copy()

row, col = camera_바카라 배팅.shape

for i in range(0, row):

for j in range(0, col):

if zero_바카라 배팅[i, j] == 0:

out_바카라 배팅[i, j] = camera_바카라 배팅[i, j] & 254

else:

out_바카라 배팅[i, j] = camera_바카라 배팅[i, j] | 1

draw_image(camera_바카라 배팅, out_바카라 배팅, "Set Watermark", "Original Image", "Result Image")

cv2.imwrite("camera_watermark.bmp", out_바카라 배팅)

set_watermark()



여기까지 하면 camera_watermark.bmp라는 결과 바카라 배팅가 만들어진다.

해당 바카라 배팅를 비트 평면 분할하여 실제로 최하위 비트에 제대로 정보가 쓰였는지 확인해 보자.


비트 평면 분할을 통해 워터마크 확인


결과를 보면 최하위 비트에 zero.bmp를 기반으로 추가한 정보가 제대로 들어가 있다.


ref.)

바카라 배팅 출처 :https://github.com/gilbutITbook/006796/blob/master/images/ch07/camera.bmp



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari