Ideogram 4.5 vs FLUX 3: 상품 이미지 정밀 편집 비교
승인된 상품 이미지에서 작은 부분만 고칠 때는 Ideogram 4.5를 먼저 시험하는 편이 합리적입니다. 여러 객체의 위치를 제어하거나 더 많은 참조 이미지가 필요하면 FLUX 3부터 시험합니다. 이 글은 동일 원본의 독립 벤치마크 없이 보편적 승자를 단정하지 않고, 재현 가능한 비교 절차와 체크포인트, 로컬 픽셀 검증을 제공합니다.
목차

상품 이미지 편집의 성공 기준은 단순히 보기 좋은 새 그림을 얻는 것이 아닙니다. 이미 승인된 자산이라면 요청은 보통 훨씬 엄격합니다. 라벨의 한 줄을 고치거나, 뚜껑 색만 바꾸거나, 작은 객체 하나를 교체하되 패키지 형태, 로고, 바코드, 조명, 반사, 그림자, 배경, 구도는 그대로 유지해야 합니다.
실무적인 첫 선택은 다음과 같습니다. “이 작은 영역만 바꾸고 나머지는 보존”이 핵심이면 Ideogram 4.5 Precise Edit를 먼저 시험합니다. 공간 배치, 여러 요소의 동시 조정, 많은 참조 이미지가 핵심이면 FLUX 3 Image를 먼저 시험합니다. 이는 보편적인 화질 순위가 아닙니다. 검토한 공식 자료에는 두 모델을 동일 원본으로 독립적이고 재현 가능하게 비교한 벤치마크가 없으므로, 최종 결정은 자체 acceptance test에서 내려야 합니다.
30초 선택표
| 요구사항 | 먼저 시험할 모델 | 이유 |
|---|---|---|
| 라벨, 규정 문구, 배지, 작은 색상 영역 수정 | Ideogram 4.5 | Precise Edit 문서는 입력과 같은 출력 크기, 선택적 mask, 의미 있게 바뀌지 않은 픽셀의 정확한 복사를 설명합니다. |
| 큰 인쇄 master에서 일부를 잘라 편집한 뒤 다시 합치기 | Ideogram 4.5 | 모델 페이지가 crop 경계를 보존해 원본에 다시 stitch하는 흐름을 직접 설명합니다. |
| 여러 요소를 이동·제거·교체 | FLUX 3 | 구조화된 bounding-box row로 원본 위치와 목표 위치를 표현할 수 있습니다. |
| 많은 참조 이미지 사용 | FLUX 3 | API는 1~10장을 받으며, Ideogram은 최대 4장이고 mask 사용 시 더 적습니다. |
| “영역 밖은 절대 바뀌면 안 됨”을 hard gate로 설정 | Ideogram 우선, 이후 로컬 검증 | Ideogram mask는 편집 영역을 제한하지만, FLUX box는 배치 가이드일 뿐 clipping mask가 아닙니다. |
| 시장별·색상별 대량 variant 제작 | 어느 쪽이든 가능하나 분기 필수 | 모든 variant를 동일한 승인 checkpoint에서 만들어야 하며, 이전 variant를 다시 편집하면 안 됩니다. |
‘정밀함’을 검증 가능한 계약으로 정의하기
모델을 선택하기 전에 세 가지를 문서로 고정합니다.
- 변경 허용 영역: 바꿀 수 있는 최소 영역. 경계 블렌딩, 그림자, 반사에 필요한 여유도 포함합니다.
- 보호 영역: 안정적으로 유지되어야 할 모든 픽셀과 객체.
- 합격 기준: 크기, 영역 밖 drift, 텍스트 정확성, 색, 기하, 조명, 색상 프로파일, 사람의 검수.
의미상 같은 이미지와 픽셀을 보존한 이미지는 다릅니다. 병이 “같아 보이더라도” 로고 자간, 라벨 질감, 하이라이트 형태, 배경 입자가 바뀔 수 있습니다. 콘셉트 이미지에서는 허용될 수 있지만, 이커머스, 규정 문구, 패키지 승인, 대형 인쇄에서는 문제가 됩니다.
Ideogram 4.5의 편집 방식
공식 Ideogram 4.5 Precise Edit API는 다음 endpoint를 사용합니다.
POST https://api.ideogram.ai/v2/image/precise-edit/ideogram-4-5
원본은 image, 지시는 prompt로 보내며, 필요하면 reference_images와 mask를 추가합니다. 문서는 출력의 폭과 높이가 입력과 같고, 편집이 의미 있게 바꾸지 않은 픽셀은 입력에서 정확히 복사된다고 설명합니다. Ideogram에 업로드하는 mask는 검정이 편집, 흰색이 유지입니다.
따라서 승인된 자산의 작은 수술식 수정에는 Ideogram의 공개 계약이 더 직접적입니다. 고해상도 파일은 Ideogram 4.5 모델 페이지가 대상 주변을 여유 있게 crop하고 편집한 뒤, 보존된 경계를 이용해 원본에 다시 합치는 방법을 안내합니다.
두 가지 주의점이 있습니다.
- API 문서에 따르면 모델이 처리하기에 너무 큰 이미지는 축소될 수 있습니다. 전체 master를 보내면서 모든 원본 픽셀이 유지될 것이라고 가정하면 안 됩니다.
- mask가 참조 슬롯 하나를 차지하므로, mask 요청에서는 사용할 수 있는 보조 이미지 수가 줄어듭니다.
기본 응답은 동기식입니다. async 또는 webhook을 사용하면 generation_id를 저장하고 GET /v2/generations/{generation_id}를 polling합니다. API 개요는 결과 URL이 만료된다고 설명하므로, 원본 출력 파일을 즉시 내려받습니다.
FLUX 3의 편집 방식
공식 FLUX 3 Image API는 다음 endpoint를 사용합니다.
POST https://api.bfl.ai/v1/flux-3-image
별도의 편집 모드는 없습니다. prompt와 하나 이상의 images를 보냅니다. API는 1~10장의 참조 이미지를 받습니다. aspect_ratio: auto에서는 prompt에 명시한 비율이 우선하고, 그렇지 않으면 참조 이미지가 있을 때 첫 번째 이미지의 framing을 유지합니다.
공간 제어의 핵심은 bounding boxes 형식입니다. 각 box는 정규화된 0~1000 grid에서 [top, left, bottom, right]로 표현합니다. Row는 요소를 유지, 이동, 추가, 교체, 재색칠, 제거하기 위한 원본 위치와 목표 위치를 나타낼 수 있습니다.
그래서 “이 객체를 정확히 여기에 놓기” 또는 “여러 요소를 한 번에 맞추기”에는 FLUX 3가 유리합니다. 다만 공식 문서는 중요한 한계를 명시합니다. box는 배치를 안내하지만 clipping mask가 아닙니다. 편집 box 밖의 픽셀은 “보통” 동일하게 유지된다고 할 뿐, 절대 보장은 아닙니다.
FLUX 요청은 비동기식입니다. 반환된 id와 polling_url을 모두 저장하고, 통합 가이드의 지침대로 반환된 URL을 사용합니다. 상태가 Ready가 되면 result.sample을 즉시 다운로드해야 합니다. BFL은 생성 이미지가 10분 뒤 접근 불가능해진다고 설명합니다.
통제된 비교에서는 grounding: false를 고려합니다. Grounding은 기본적으로 web 또는 image search를 사용할 수 있는데, 제공된 상품 이미지의 로컬 수정에는 불필요한 변수입니다.
동일 원본으로 재현 가능한 비교하기
1. 변경 불가능한 master 고정
무손실 PNG 또는 승인된 TIFF에서 만든 PNG를 사용합니다. 파일명, SHA-256, 픽셀 크기, 색상 프로파일, 승인 버전을 기록하고, 생성 과정이 덮어쓸 수 없는 복사본을 보관합니다.
2. 내부용 ‘변경 허용 mask’ 만들기
원본과 같은 크기의 grayscale 이미지를 만듭니다.
- 흰색: 변경 가능.
- 검정: 보호되어야 함.
대상 주변에 작은 guard band를 포함합니다. 라벨에 그림자, 반사, 엠보싱, 투명 필름이 있다면 자연스럽게 변해야 하는 효과도 허용 영역에 넣습니다.
이 내부 검증 mask는 “흰색=변경 가능”입니다. Ideogram 업로드 mask의 “검정=편집, 흰색=유지”와 반대이므로 파일명을 분명히 구분합니다.
3. 한 요청에는 한 가지 업무 변경만 넣기
좋은 테스트는 한 줄 교체, 뚜껑 색만 변경, 스티커 한 장 제거입니다. 텍스트 수정, 배경 교체, 재조명, 재구도를 한 번에 섞지 않습니다.
Prompt 템플릿:
LABEL EDIT
Change only the product label text from "CLASSIC" to "ZERO SUGAR".
Keep the package shape, logo, barcode, lighting, reflections, shadows, background,
camera angle, crop, and all pixels outside the label area unchanged.
Do not redesign, restyle, or add objects.
COLORWAY
Change only the bottle cap from matte black to Pantone 186 C red.
Preserve the bottle, label, liquid, highlights, reflections, shadows, background,
camera angle, crop, and every object outside the cap area.
OBJECT REPLACEMENT
Replace only the small paper sticker with a clean white sticker of the same size,
position, perspective, edge softness, and shadow. Keep everything else unchanged.
FLUX에서 위치가 핵심이면 측정한 box row를 추가합니다. 아래는 예시이므로 실제 원본에서 좌표를 계산해야 하며, box가 mask는 아니라는 점을 기억합니다.
Edit only <front_label>. Keep every other part of ref_image_0 unchanged.
[
{
"id": "front_label",
"from": null,
"src_bbox": null,
"tgt_bbox": [360, 285, 690, 725],
"desc": "the same front label with the text ZERO SUGAR; preserve its size, perspective, typography, print texture, highlights, and shadow"
}
]
4. 업무 의도는 같게, 제어 방식은 모델에 맞게
- Ideogram: 전체 이미지 또는 여유 있는 crop을 보내고, 엄격한 국소화가 필요하면 검정-편집/흰색-유지 mask를 사용합니다.
- FLUX 3: 원본을
images의 첫 번째에 두고,aspect_ratio: auto를 유지하며, 필요하면 box row를 넣고, 비교 run에서는 grounding을 끕니다.
모든 설정을 기록합니다. 공정한 비교는 UI를 억지로 같게 만드는 것이 아니라, 같은 업무 요청을 각 제품의 문서화된 제어로 수행하는 것입니다.
5. 원시 출력을 즉시 저장
브라우저 screenshot, 채팅 preview, SNS 압축 이미지를 비교하지 않습니다. 다음처럼 이름을 붙입니다.
masterHash_model_editId_attempt.ext
후보의 hash도 계산합니다. 이후 resize, 색 변환, 압축을 한 파일은 모델 원본과 별도 derivative로 보관합니다.
보호 픽셀을 로컬에서 검증하기
다음 스크립트는 내부 허용 mask 밖에서 원본과 후보를 비교합니다. 차이 지도에서 변경된 보호 픽셀은 흰색, 허용 영역은 회색, 변경되지 않은 보호 영역은 검정으로 표시됩니다.
의존성 설치:
python -m pip install pillow numpy
verify_edit.py로 저장합니다.
#!/usr/bin/env python3
"""Check whether an edited image changed pixels outside an allowed mask."""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
import numpy as np
from PIL import Image
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("original", type=Path)
parser.add_argument("edited", type=Path)
parser.add_argument("allowed_mask", type=Path,
help="white = may change, black = must stay unchanged")
parser.add_argument("--tolerance", type=int, default=0,
help="maximum per-channel delta treated as unchanged")
parser.add_argument("--max-outside-ratio", type=float, default=0.0)
parser.add_argument("--diff-map", type=Path, default=Path("outside-diff.png"))
return parser.parse_args()
def main() -> int:
args = parse_args()
if not 0 <= args.tolerance <= 255:
raise SystemExit("--tolerance must be between 0 and 255")
if not 0.0 <= args.max_outside_ratio <= 1.0:
raise SystemExit("--max-outside-ratio must be between 0 and 1")
with Image.open(args.original) as original_file, \
Image.open(args.edited) as edited_file, \
Image.open(args.allowed_mask) as mask_file:
if original_file.size != edited_file.size or original_file.size != mask_file.size:
print("FAIL: original, edited image, and mask must have identical dimensions")
return 2
original_profile = original_file.info.get("icc_profile")
edited_profile = edited_file.info.get("icc_profile")
original = np.asarray(original_file.convert("RGB"), dtype=np.int16)
edited = np.asarray(edited_file.convert("RGB"), dtype=np.int16)
allowed = np.asarray(mask_file.convert("L")) >= 128
delta = np.abs(edited - original)
changed = np.max(delta, axis=2) > args.tolerance
protected = ~allowed
outside_changed = changed & protected
protected_pixels = int(protected.sum())
changed_pixels = int(outside_changed.sum())
outside_ratio = changed_pixels / protected_pixels if protected_pixels else 0.0
max_delta = int(delta[protected].max()) if protected_pixels else 0
diff_map = np.zeros(allowed.shape, dtype=np.uint8)
diff_map[allowed] = 64
diff_map[outside_changed] = 255
Image.fromarray(diff_map, mode="L").save(args.diff_map)
print(f"protected_pixels={protected_pixels}")
print(f"outside_changed_pixels={changed_pixels}")
print(f"outside_changed_ratio={outside_ratio:.8f}")
print(f"max_outside_channel_delta={max_delta}")
print(f"icc_profile_match={original_profile == edited_profile}")
print(f"diff_map={args.diff_map}")
if outside_ratio > args.max_outside_ratio:
print("FAIL: protected area changed beyond the allowed threshold")
return 1
print("PASS: protected-area pixel check passed")
return 0
if __name__ == "__main__":
sys.exit(main())
무손실 파일에 엄격한 검사를 실행합니다.
python verify_edit.py master.png candidate.png allowed-mask.png --tolerance 0 --max-outside-ratio 0
outside_changed_pixels=0이면 허용 영역 밖 RGB 값이 동일합니다. outside_changed_ratio가 0이 아니면 drift가 있으므로 outside-diff.png를 확인합니다. icc_profile_match=False는 색상 처리 경로가 바뀌었다는 경고입니다. 허용치 0은 무손실 파일에 적합합니다. JPEG 재압축은 많은 픽셀을 바꾸므로, 무손실 원본 출력을 검증하거나 승인된 기준값을 문서화합니다.
영역 밖 픽셀이 같아도 편집 부분이 올바르다는 뜻은 아닙니다. 철자, 글꼴, 로고, 재질, 원근, 경계, 하이라이트, 그림자, 반사, 가림 관계를 사람이 확인합니다.
반복 편집에서 drift 누적 막기
파일을 세 가지로 구분합니다.
- Master: 승인되고 변경 불가능한 원본.
- Checkpoint: 자동 검사와 사람 검수를 통과한 후보.
- Variant: checkpoint에서 분기한 시장·색상·규격별 버전.
빨강, 파랑, 초록 버전은 모두 같은 checkpoint에서 만듭니다. 빨강에서 파랑, 파랑에서 초록을 만들지 않습니다. 한 번에 한 가지만 바꾸고, 실패하면 마지막 승인 checkpoint로 돌아갑니다. 거절된 출력 위에서 “drift를 고쳐 달라”는 추가 편집을 이어가지 않습니다.
편집 ledger에는 원본 hash, 모델, endpoint, prompt, mask 또는 box, 출력 hash, 크기, 보호 영역 변경 비율, reviewer 결정을 남깁니다. Ideogram의 drift 감소 설명과 FLUX의 box 제어도 이 절차로 검증해야 하며, checkpoint를 대신하지 못합니다.
시나리오별 권장 순서
라벨 또는 규정 문구 수정
Ideogram 4.5 우선. 여유 있는 crop과 공급자 mask를 사용하고, 다시 합치기 전에 모든 문자를 확인합니다. 복잡한 배치에는 FLUX도 시험할 수 있지만 box를 격리 보장으로 해석하지 않습니다.
단일 색상 변경
경계가 명확하고 나머지가 픽셀 단위로 안정적이어야 하면 Ideogram 4.5 우선입니다. 색 반사와 투사광도 허용 영역에 포함합니다. 여러 객체가 함께 바뀌거나 참조가 재질과 팔레트를 정의하면 FLUX 3 우선입니다.
객체 교체·이동·제거
원본 위치와 목표 위치가 핵심이면 FLUX 3 우선입니다. 대상이 작고 mask로 분리할 수 있으며 정확한 원본 기하가 더 중요하면 Ideogram 4.5 우선입니다.
고해상도 인쇄 master
여유 있게 crop하고, 부분 편집하고, 경계를 검증한 뒤 다시 합칩니다. Ideogram은 이 흐름을 직접 문서화합니다. FLUX에서는 최종 크기와 보호 픽셀을 전제가 아니라 합격 기준으로 둡니다.
대량 variant
작고 대표적인 세트에서 두 흐름을 시험하고, 거절률과 수동 보정이 적은 쪽을 선택합니다. checkpoint를 고정하고 모든 variant를 거기서 분기합니다.
공개 전 체크리스트
- 후보가 올바른 master 또는 checkpoint에서 왔다.
- 한 번에 기록된 한 가지 변경만 요청했다.
- 크기, 방향, crop이 맞다.
- 보호 영역이 프로젝트 기준을 통과한다.
- 텍스트, 로고, 바코드, 규정 정보가 정확하다.
- 재질, 경계, 그림자, 반사, 가림 관계가 자연스럽다.
- 프로파일과 포맷이 목적 채널에 맞다.
- 원시 출력, prompt, 제어 데이터, hash, 검수 결정을 보관했다.
- 새 variant는 다른 variant가 아니라 checkpoint에서 만든다.
결론
완성된 상품 이미지의 작은 수술식 수정에는 보존 계약과 실제 mask를 공개한 Ideogram 4.5를 먼저 시험하는 것이 합리적입니다. 공간 관계가 복잡하거나 여러 요소·많은 참조를 다루는 편집에는 구조화된 box를 제공하는 FLUX 3를 먼저 시험하는 것이 합리적입니다.
어느 쪽도 검증을 없애 주지 않습니다. 변경 불가능한 master를 보존하고, 같은 source로 시험하며, 보호 영역을 측정하고, 변경 부분을 사람이 확인하고, variant 전에 checkpoint를 승인합니다. 이 절차가 작은 수정의 연속이 조용히 새 이미지로 바뀌는 것을 막습니다.