이미지의 특정 영역을 가리고 복원하기
Cipher의 Visual Obfuscation은 채널의 image scrambling seed를 사용해 다각형 안의 픽셀 RGB 값을 재배열하고 변경합니다. 화면에 가림막을 덧붙이는 방식이 아니라 픽셀 자체를 바꿉니다. 연산은 가역적이고 교환 가능하며, 적절한 복호화 라이선스가 있는 사용자는 반대 변환으로 원래 픽셀을 복원할 수 있습니다.
예시 이미지에는 Humans in the Loop가 CC0으로 제공한 Car Parts and Car Damages 데이터셋을 사용했습니다.
채널, 라이선스와 미디어 집합 준비
Visual obfuscation알고리즘의 Cipher 채널을 만듭니다.- 암호화가 허용된 Admin License를 만들고 변환 담당자에게 접근을 부여합니다. Visual Obfuscation의 변환은 현재 Code Repositories에서만 지원하므로
Grant cryptographic key access가 필요합니다. - 복호화가 허용된 Operational User License를 만들고 업무 이용자에게 접근을 부여합니다.
- 입력 이미지를 미디어 집합에 가져오고 PNG 형식의 출력 미디어 집합을 준비합니다.
이미지는 PNG만 지원합니다. PNG는 무손실 형식이므로 픽셀 변환과 복원 과정에서 손실 압축에 의한 흔적이 생기지 않도록 할 수 있습니다.
Python 변환으로 사각형 영역 처리
저장소에 bellaso-python-lib를 추가합니다. 다음 예제는 각 이미지의 왼쪽 위 100×100 픽셀 영역을 가립니다. 입력은 그 영역을 포함하는 PNG 이미지이며, 경로는 가상 값이므로 실제 미디어 집합과 Admin License 경로로 바꿉니다.
import io
from transforms.api import transform
from transforms.mediasets import MediaSetInput, MediaSetOutput
from bellaso_python_lib.encryption.encrypter_input import EncrypterInput
from bellaso_python_lib.types import Coordinate
@transform(
mediaset_in=MediaSetInput("/Training/Cipher/images_raw"),
mediaset_out=MediaSetOutput("/Training/Cipher/images_obfuscated"),
encrypter=EncrypterInput("/Training/Cipher/licenses/image-admin"),
)
def obfuscate_image_regions(ctx, mediaset_in, mediaset_out, encrypter):
polygon = [
Coordinate({"x": 0, "y": 0}),
Coordinate({"x": 100, "y": 0}),
Coordinate({"x": 100, "y": 100}),
Coordinate({"x": 0, "y": 100}),
]
media_references = mediaset_in.list_media_items_by_path_with_media_reference(
ctx
).toLocalIterator()
for row in media_references:
image_file = mediaset_in.get_media_item(row["mediaItemRid"])
image_bytes = image_file.read()
if not image_bytes:
raise ValueError(f"이미지 데이터가 비어 있습니다: {row['path']}")
obfuscated = encrypter.obfuscate_image(image_bytes, [polygon], ctx)
mediaset_out.put_media_item(io.BytesIO(obfuscated), row["path"])
출력은 입력과 같은 미디어 경로를 사용합니다. 여러 이미지의 영역을 다르게 지정할 때에는 해당 이미지의 좌표를 준비해 polygon_list 인수에 전달합니다. 화면에서 영역을 선택해 복원하려면 같은 좌표와 채널 정보를 온톨로지에도 연결해야 합니다.
Workshop에서 영역별 복원
Image Display 위젯의 이 기능은 Beta입니다. 다음 구성을 사용합니다.
- Pipeline Builder로 가린 이미지 미디어 집합을 온톨로지 객체에 연결합니다.
- 각 영역을 나타내는 별도 객체 유형을 만듭니다.
- 영역 객체에서 이미지 객체로 다대일 링크를 만듭니다.
- Workshop의 Image Display 위젯에 영역 객체를 설정합니다.
- 사용자가 원하는 영역을 고른 뒤
Decrypt selected areas를 선택해 원래 이미지를 확인합니다.
영역 객체에는 다음 스키마 또는 같은 정보를 표현하는 스키마가 필요합니다.
| 속성 | 형식과 용도 |
|---|---|
polygonId | 영역 객체의 기본 키입니다. |
imagePath | String입니다. 가린 이미지와 연결할 외래 키입니다. |
cipherChannelRid | String입니다. 해당 영역을 처리한 실제 Cipher 채널 RID이며 ri.bellaso.main.cipher-channel.<uuid> 형태입니다. |
polygon | 좌표 목록을 JSON으로 직렬화한 String입니다. |
label | 선택적인 String 레이블입니다. |
위 사각형의 polygon 문자열에 담을 JSON은 다음과 같습니다.
[[0, 0], [100, 0], [100, 100], [0, 100]]
채널과 라이선스의 권한 범위는 Cipher 구성, 일반 텍스트 암호문의 표시와 편집은 객체 및 함수를 참조합니다.