객체 제거 API: GPT Image 2로 사진 속 원치 않는 객체 지우기
객체마다 문장 하나면 세 번의 제거가 모두 성공했습니다. 실행한 코드, 원본 크기 결과, 아직 맡기기 어려운 부분을 소개합니다.
이 페이지 목차
2026년 10월 28일 GPT-Image 2 편집 엔드포인트에 객체마다 문장 하나를 보내는 것만으로 공원 사진에서 개를 데리고 걷는 여성, 파란 쓰레기통, 빨간 연을 각각 지웠습니다. 세 번의 실행 모두 문장은 하나였습니다. 지운 자리는 주변의 땅과 하늘에 자연스럽게 이어졌고, 벤치와 나무, 스카이라인은 원래 자리에 그대로 남았습니다.
호출은 프롬프트와 원본 이미지 한 장을 보내고 완성된 새 이미지를 받는 방식입니다. 아래에는 실제로 실행한 Python, 세 결과의 원본 크기 이미지, 그리고 다시 하고 싶어지는 채움을 찾아내는 확인 항목을 담았습니다.
문장 하나로 지우는 방식
사진 한 장과 문장 하나를 보냅니다. 문장에는 지울 객체, 그 자리에 무엇을 채울지, 남겨야 할 것을 적습니다. 모델이 그 영역을 다시 그리고 전체를 새 이미지로 돌려주므로 별도의 합성 단계가 없습니다.
호출은 OmniaKey의 다른 편집 작업과 같은 미디어 작업입니다. 모델은 gpt-image-2, type은 image, operation은 edit입니다. 원본 사진을 Base64로 input의 image에 넣고, 문장은 input의 prompt에 넣습니다. parameters의 size는 WIDTHxHEIGHT로 쓰고, quality는 low, medium, high, auto 중에서 고르며, n은 1이어야 합니다. 두 작업 모두 모델 페이지에 나와 있습니다.
결과를 좌우하는 것은 문장입니다. "하늘에 떠 있는 작은 빨간 연"은 "빨간 것"과 전혀 다른 작업이고, "잔디와 보도 블록"이라고 쓰면 지운 자리가 무엇으로 채워질지까지 정해집니다. 문장 순서는 GPT Image 2 프롬프트 가이드에서 다루고 있으며, FLUX Kontext 대안 가이드에서도 같은 형식의 지시를 GPT Image 2에 사용합니다.
요청
Python 파일 하나로 끝납니다. 사진을 인코딩하고, 작업을 만들고, 끝날 때까지 폴링한 뒤 PNG를 내려받습니다.
import base64
import json
import os
import time
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def edit_image(source_path, prompt, out_path, size="1024x1536", quality="medium"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": "gpt-image-2",
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "quality": quality},
}
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
for _ in range(150):
time.sleep(4)
state = request("GET", f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: valid for about an hour, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
if __name__ == "__main__":
task = edit_image(
"park-base.jpg",
"Remove the blue trash bin completely. Fill its spot with grass and paving stones so it matches the surroundings. Keep everything else exactly the same. Photorealistic, no text, no logos.",
"park-no-bin.png",
size="1536x1024",
)
print("task", task)
2026년 10월 28일 다른 프롬프트로 이 함수를 확인했습니다. 베이스 모델의 1024픽셀 JPEG에 노란 우비를 입히는 지시를 보냈고, 돌아온 것은 1024x1536 PNG였습니다.
- 생성 호출은 HTTP 202와 작업 id를 돌려줍니다(OmniaKey 이미지 문서, 2026년 10월 28일 확인). 상태가 queued나 processing이면 같은 작업을 계속 폴링합니다. succeeded면 결과물이 준비된 것입니다. 실패한 작업에는 오류 코드와 메시지가 붙고 요금은 청구되지 않습니다.
- 결과물의 서명 URL은 약 1시간 뒤 만료되며 파일 자체는 24시간 보관됩니다. 작업이 성공하면 API 키 없이 일반 GET으로 즉시 내려받습니다.
- 인라인 Base64는 1 MiB 요청 한도에 포함되므로 휴대폰 사진은 먼저 줄여야 합니다.
User-Agent헤더를 보냅니다. 2026년 10월 28일 Python 기본값으로 보낸 요청은 HTTP 403을 받았고, 이 헤더를 붙이자 통과했습니다.- size는 명시하므로 가로 사진은 1536x1024로 나갑니다. GPT Image는 항상 불투명 PNG를 반환하니 실제 크기는 내려받은 파일에서 읽습니다.
요금은 OpenAI 가격 페이지 기준으로 GPT Image 2가 이미지 입력 토큰 100만 개당 $8.00, 이미지 출력 토큰 100만 개당 $30.00이며 배치 요금은 절반입니다(2026년 10월 28일 확인). 페이지에 이미지 한 장당 가격표는 없고, 이미지 생성 가이드에 한 장을 계산하는 도구가 있습니다. OmniaKey의 현재 요금은 가격 페이지에 있습니다.
공원 사진 한 장에서 세 번의 제거
네 이미지는 모두 같은 기본 프레임에서 나왔습니다. 맑은 도시 공원 산책로, 가운데 나무 벤치, 왼쪽에 파란 금속 쓰레기통, 카메라 쪽으로 작은 갈색 개를 데리고 걷는 여성, 맑은 하늘 높이 떠 있는 작은 빨간 연입니다. 기본 이미지와 결과는 모두 1536x1024, quality medium으로 2026년 10월 28일 OmniaKey를 통해 GPT Image 2로 만들었습니다. 장면과 사람은 합성입니다. 객체마다 문장 하나를 보내고 각각 한 번씩만 실행했습니다.
| 지운 객체 | 보낸 지시 | 돌아온 결과 |
|---|---|---|
| 여성과 개 | "Remove the woman and the small brown dog completely. Fill the path and the grass naturally so they match the surroundings. Keep the bench, the blue bin, the trees, the kite and the sky exactly the same. Photorealistic, no text, no logos." | 여성과 개가 사라지고 산책로와 잔디가 채워졌으며 벤치, 쓰레기통, 나무, 연, 하늘이 유지됨 |
| 파란 쓰레기통 | "Remove the blue trash bin completely. Fill its spot with grass and paving stones so it matches the surroundings. Keep everything else exactly the same. Photorealistic, no text, no logos." | 쓰레기통이 사라지고 그 자리가 잔디와 보도 블록으로 채워졌으며 여성과 개는 남아 있음 |
| 빨간 연 | "Remove the small red kite from the sky. Keep the sky natural and everything else exactly the same. Photorealistic, no text, no logos." | 연이 사라지고 하늘은 자연스러우며 나머지 화면은 그대로임 |

GPT-Image 2를 OmniaKey API로 2026년 10월 28일에 생성, 크기 1536x1024, quality medium.
두 번째 타일에서는 여성과 개가 사라지고 그 뒤로 산책로와 잔디가 이어지며 벤치, 쓰레기통, 나무, 연, 스카이라인이 남아 있습니다. 세 번째는 쓰레기통을 지우고 그 자리를 잔디와 보도 블록으로 다시 만든 결과로, 여성과 개는 아직 화면에 있습니다. 네 번째는 연만 하늘에서 지우고 나머지는 그대로 둡니다.
제거 후 확인할 것
배포 전에 모든 타일을 실제 크기로 봅니다.
- 채움의 가장자리와 주변. 새 잔디, 보도 블록, 산책로 질감은 반드시 기존 부분과 만납니다. 모델이 사진 전체를 다시 그리므로 그 이음매와 객체 주변 여백을 원본과 비교하십시오. 흐리거나 반복되거나 번진 자국이 가장 먼저 거기서 드러납니다.
- 객체에 닿아 있던 것. 목줄, 그림자, 반사는 함께 다시 그려져야 합니다.
- 남길 것 목록을 하나씩. 첫 번째 제거에서는 벤치, 쓰레기통, 나무, 연, 하늘이 남았고 두 번째에서는 여성과 개가 남았습니다. 항목 이름을 대고 나서 실제로 있는지 확인합니다.
배포해도 되는 경우는 실제 크기 화면에서 채움이 버티고 남길 것 목록의 모든 항목이 제자리에 있을 때입니다. 채움이 얼룩처럼 보이면 같은 문장에 재료를 넣어 다시 실행하십시오. 예를 들어 "잔디와 보도 블록"입니다.
테스트하지 않은 것
마스크 입력, 사람이 붐비는 장면, 아주 작은 객체는 테스트하지 않았습니다. 사진에 군중, 긴 울타리, 목줄처럼 가는 끈이 있다면 두 번째 실행을 계획하고 그 가장자리를 원본 크기로 확인하십시오.
지시 템플릿
[지울 객체, 구별되는 특징까지]를 완전히 지우십시오. 그 자리는 [재료]로 채워 주변과 어울리게 하십시오. [남겨야 할 것]은 정확히 그대로 두십시오. 사실적인 사진, 글자 없음, 로고 없음.
- 구별되는 특징까지 적은 객체. "하늘에 떠 있는 작은 빨간 연"이 "연"보다 낫고, 프레임에 여러 개가 있어도 어느 것인지 알려 줍니다.
- 재료로 쓴 채움. "잔디와 보도 블록"은 모델이 주변에 맞출 기준을 줍니다. "지워라"만 쓰면 무엇으로 채울지 모델이 정합니다.
- 남길 것 목록. 벤치, 파란 쓰레기통, 나무, 연, 하늘처럼 살아남아야 할 것을 이름으로 적습니다.
- 스타일 마무리. "사실적인 사진, 글자 없음, 로고 없음"은 사진을 사진답게 유지합니다.
사람의 옷을 바꿀 때도 모양은 같고, 바꿀 옷을 객체로 이름 붙입니다. 절차는 가상 피팅 가이드에서 설명합니다.
자주 묻는 질문
API로 사진에서 사람을 지울 수 있나요?
가능하지만 결과 확인이 필요합니다. 첫 번째 제거에서 여성과 개는 한 단계로 화면을 떠났고, 뒤의 산책로와 잔디가 다시 그려졌습니다.
엔드포인트가 마스크를 받나요?
OmniaKey 문서가 설명하는 것은 원본 이미지 한 장과 프롬프트입니다(2026년 10월 28일 확인). 마스크 필드에 대한 설명은 없고 마스크를 사용한 실행도 없습니다. 영역을 칠하는 대신 객체와 위치를 글로 지정합니다.
결과 링크는 얼마나 유지되나요?
서명 링크는 약 1시간(OmniaKey 문서, 2026년 10월 28일 확인)이며 파일 자체는 24시간 보관됩니다. 작업이 성공하면 바로 내려받으십시오.
어떤 크기를 요청해야 하나요?
size는 WIDTHxHEIGHT 형식으로 명시합니다. 가로 사진이라면 1536x1024 같은 값입니다. 실제 크기는 내려받은 PNG에서 읽으십시오. GPT Image는 항상 불투명 파일을 반환하므로 자르기는 다운로드 후에 계획합니다.
지시 하나로 객체 두 개를 지울 수 있나요?
첫 번째 제거에서는 문장 하나로 여성과 개를 함께 지웠습니다. 다른 조합은 테스트 대상이 아니었습니다.
파라미터는 GPT-Image 2 모델 페이지에서, 다음 제거를 계획하기 전에 현재 요금을 확인하십시오.
이 글에서 다루는 모델
관련 글
GPT Image 2 프롬프트 가이드: 구조, 예시, 실제 생성 이미지
프롬프트 8개, 실제 이미지 9장: GPT Image 2가 정확히 맞춘 점, 제멋대로 더한 점, 고치는 법을 정리했습니다.
가상 피팅 API: GPT Image 2로 옷 갈아입히기
사진 한 장과 프롬프트 하나면 옷을 바꿀 수 있습니다. 요청 코드, 2026년 10월 28일에 실행한 세 번의 교체, 결과가 어디서 어긋나는지 정리했습니다.
FLUX Kontext API 대안: GPT Image 2로 이미지 편집하기
마스크 없는 지시문 편집. 요청 코드, 2026년 10월 28일에 3단계로 돌린 연쇄 편집, 각 단계가 지켜낸 것을 담았습니다.
