You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openai-cookbook/examples/dalle/Image_generations_edits_and...

513 lines
12 MiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# DALL-E\n",
"\n",
"This notebook shows how to use OpenAI's DALL-E image API endpoints.\n",
"\n",
"There are three API endpoints:\n",
"- **Generations:** generates an image or images based on an input caption\n",
"- **Edits:** edits or extends an existing image\n",
"- **Variations:** generates variations of an input image"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup\n",
"\n",
"- Import the packages you'll need\n",
"- Import your OpenAI API key: You can do this by running \\``export OPENAI_API_KEY=\"your API key\"`\\` in your terminal.\n",
"- Set a directory to save images to"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# imports\n",
"import openai # OpenAI Python library to make API calls\n",
"import requests # used to download images\n",
"import os # used to access filepaths\n",
"from PIL import Image # used to print and edit images\n",
"\n",
"# set API key\n",
"openai.api_key = os.environ.get(\"OPENAI_API_KEY\")\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"image_dir='./images'\n"
]
}
],
"source": [
"# set a directory to save DALL-E images to\n",
"image_dir_name = \"images\"\n",
"image_dir = os.path.join(os.curdir, image_dir_name)\n",
"\n",
"# create the directory if it doesn't yet exist\n",
"if not os.path.isdir(image_dir):\n",
" os.mkdir(image_dir)\n",
"\n",
"# print the directory to save to\n",
"print(f\"{image_dir=}\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generations\n",
"\n",
"The generation API endpoint creates an image based on a text prompt.\n",
"\n",
"**Required inputs:**\n",
"- prompt (str): A text description of the desired image(s). The maximum length is 1000 characters.\n",
"\n",
"**Optional inputs:**\n",
"- n (int): The number of images to generate. Must be between 1 and 10. Defaults to 1.\n",
"- size (str): The size of the generated images. Must be one of \"256x256\", \"512x512\", or \"1024x1024\". Smaller images are faster. Defaults to \"1024x1024\".\n",
"- response_format (str): The format in which the generated images are returned. Must be one of \"url\" or \"b64_json\". Defaults to \"url\".\n",
"- user (str): A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse. [Learn more.](https://beta.openai.com/docs/usage-policies/end-user-ids)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"created\": 1667611641,\n",
" \"data\": [\n",
" {\n",
" \"url\": \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-SFJhix3AV4bmPFvqYRJDkssp.png?st=2022-11-05T00%3A27%3A21Z&se=2022-11-05T02%3A27%3A21Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-05T01%3A27%3A21Z&ske=2022-11-06T01%3A27%3A21Z&sks=b&skv=2021-08-06&sig=0ZHl38v5UTFjA7V5Oshu8M58uHI5itEfvo2PX0aO6kA%3D\"\n",
" }\n",
" ]\n",
"}\n"
]
}
],
"source": [
"# create an image\n",
"\n",
"# set the prompt\n",
"prompt = \"A cyberpunk monkey hacker dreaming of a beautiful bunch of bananas, digital art\"\n",
"\n",
"# call the OpenAI API\n",
"generation_response = openai.Image.create(\n",
" prompt=prompt,\n",
" n=1,\n",
" size=\"1024x1024\",\n",
" response_format=\"url\",\n",
")\n",
"\n",
"# print response\n",
"print(generation_response)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: If you get this error - `AttributeError: module 'openai' has no attribute 'Image'` - you'll need to upgrade your OpenAI package to the latest version. You can do this by running `pip install openai --upgrade` in your terminal."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# save the image\n",
"generated_image_name = \"generated_image.png\" # any name you like; the filetype should be .png\n",
"generated_image_filepath = os.path.join(image_dir, generated_image_name)\n",
"generated_image_url = generation_response[\"data\"][0][\"url\"] # extract image URL from response\n",
"generated_image = requests.get(generated_image_url).content # download the image\n",
"\n",
"with open(generated_image_filepath, \"wb\") as image_file:\n",
" image_file.write(generated_image) # write the image to the file\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/generated_image.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x114DE3640>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# print the image\n",
"print(generated_image_filepath)\n",
"display(Image.open(generated_image_filepath))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variations\n",
"\n",
"The variations endpoint generates new images (variations) similar to an input image.\n",
"\n",
"Here we'll generate variations of the image generated above.\n",
"\n",
"**Required inputs:**\n",
"- image (str): The image to use as the basis for the variation(s). Must be a valid PNG file, less than 4MB, and square.\n",
"\n",
"**Optional inputs:**\n",
"- n (int): The number of images to generate. Must be between 1 and 10. Defaults to 1.\n",
"- size (str): The size of the generated images. Must be one of \"256x256\", \"512x512\", or \"1024x1024\". Smaller images are faster. Defaults to \"1024x1024\".\n",
"- response_format (str): The format in which the generated images are returned. Must be one of \"url\" or \"b64_json\". Defaults to \"url\".\n",
"- user (str): A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse. [Learn more.](https://beta.openai.com/docs/usage-policies/end-user-ids)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"created\": 1667611666,\n",
" \"data\": [\n",
" {\n",
" \"url\": \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-7HTTBl2k9l4Ir4BTHXnJvFz9.png?st=2022-11-05T00%3A27%3A46Z&se=2022-11-05T02%3A27%3A46Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T01%3A50%3A22Z&ske=2022-11-05T01%3A50%3A22Z&sks=b&skv=2021-08-06&sig=QlcKhn427bOAQobM8CmpEf3K90OiumP5jOQwkJpcH6Y%3D\"\n",
" },\n",
" {\n",
" \"url\": \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-KGKrKGzlsXN0INxaeII2t8XG.png?st=2022-11-05T00%3A27%3A46Z&se=2022-11-05T02%3A27%3A46Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T01%3A50%3A22Z&ske=2022-11-05T01%3A50%3A22Z&sks=b&skv=2021-08-06&sig=RbPoAwXMVfdPxKF40ZjVjlclrnzaQZS%2BxzhgkEcYhOk%3D\"\n",
" }\n",
" ]\n",
"}\n"
]
}
],
"source": [
"# create variations\n",
"\n",
"# call the OpenAI API, using `create_variation` rather than `create`\n",
"variation_response = openai.Image.create_variation(\n",
" image=generated_image, # generated_image is the image generated above\n",
" n=2,\n",
" size=\"1024x1024\",\n",
" response_format=\"url\",\n",
")\n",
"\n",
"# print response\n",
"print(variation_response)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# save the images\n",
"variation_urls = [datum[\"url\"] for datum in variation_response[\"data\"]] # extract URLs\n",
"variation_images = [requests.get(url).content for url in variation_urls] # download images\n",
"variation_image_names = [f\"variation_image_{i}.png\" for i in range(len(variation_images))] # create names\n",
"variation_image_filepaths = [os.path.join(image_dir, name) for name in variation_image_names] # create filepaths\n",
"for image, filepath in zip(variation_images, variation_image_filepaths): # loop through the variations\n",
" with open(filepath, \"wb\") as image_file: # open the file\n",
" image_file.write(image) # write the image to the file\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/generated_image.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x119A22F40>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/variation_image_0.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x119A0AF10>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/variation_image_1.png\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAIAAADwf7zUAAAAaGVYSWZNTQAqAAAACAACknwAAgAAACkAAAAmkoYAAgAAABgAAABQAAAAAE9wZW5BSS0tMjdkMTAyNTY3YTNkZDQ5YjhkMWZhZDliOWIyZjYyZTgAAE1hZGUgd2l0aCBPcGVuQUkgREFMTC1FAJ9gMrkAAQAASURBVHicNP1Lc2zJsqSJqZqZ+4oA9t6Z53FfdYslUj0gJ6T0qP8C+eM5JyfsJqvr1n2cczJzPwDEWu5mphxE9hgQgQDwcDdT+1SN//f/x/+yhWFwRrWqMcyIBgAP1Ya67YBBKzUaW53a2kEOjlbLBFHWtdvpItpsGHZmttzCKLOBXrSwiH1dTsJIGQDShKqWkU2gIciMziFUlegd5Ullyga8IKNR2TTBbo4FaYlyD5ir5aJNa1U33ZpuvVpOd6/qYZHr5AihnNFdktEA0QZqlxuEUJeHqXtwXEigw7wLHKiSdYf5bjkIukxONsCkT+2SusN5FWegSmgZAYaUsqZFyHovNy8y2aGgQbVteLeIVpskhQVgFtIGotEqOYXpyB7DAVWjoWHc3QcnA1Ua3jshN5Jm3ZxWlxjY5cOyCzCDNdPgTajKhhHbdVSlRTjbhhnhgxI4cMSYEEYcHplJmMekw5xoFbbD1RLqfj+qVCkyqxmTmXUMI6xo3XIRzmqhN9rnhEyAg0OdQjG5mUabZiV2iq5SB82MVWg2ugLmEd3dzWY6YqsJzjnXYx2vM1epa97GzobQArM0bHh05bpOn7e9TveYMd4f79dmQ8oec3ZeYuzaBs4wD+8tD/PD7sc9axsyYrRn2DwixuEs0Fgts6JZs3MJxtxrznBarpOm8JsHsnYMCh5kpyLi229vPx6P++vt/PFxBr7+8v2Xv/22s4/by+PjDSCLtxlmSvFa5+tPt//8Xz+PV5lpTDn81++/tTtv+vxpVvdj+XXul2Oe+euY+fmP9vpzTd0e73a9GTA95sv9p1/+7Vdc8/w2f/m3D+XNrFpJ72M6/7w/zbGs+zo9jmi8X9eMIPD+2Me0crvP6LrsUHibmZzRUnjl2+343NzSyM7bMU359nEyyPjxd/8Qf/7718f5lsvt0Dzm5nr78YuT99cv+4PX6W1hbvfjuN+irjrfP759ff+Hf/xyXXW+x/pxjDHM0IxvP4qe//hPmvMXcp8fx1rT2v/tv/V9vP/P/9d/rse3r3/72z/9p/+yP95+vL/Z0Z/i9ulmrwHX1uqpQ3nPquPlfh8vb9fVjcfbhlv4rKz7vN1fb4R9fM9ffn18/y0/v/78+Q+fbgcz1wBJ/8vXH9Tt4ni81fvH+6l+8TFeolf+9v390+vLMXG/fwbWj3NJ0/3lsSt33V5etU8aa9nXxctH0xxNBss4ejAQYURfuVR7XzGme6xc1gyPVcvcV19R0WiCc9hxHNWtJkwj/LEeDuwFHwr3Tl27W7od8/3jYRYRgdbZVzTXzpiDbIMDlFi6nFbd6h63w5rJ8jaQYUBZ5jaL3ZsR2tsHW5mF3gXzYdZClV29tPpx7Rnz/bpKdDg9qqpWIcCCB69dY3h3m2TGbEMlDansdgBAH3PWXhBXtc/JXVBK5Iggu/fw2AswSSzgIJZ2wYY7pUDJfHei3dCS3CzpldsNRsvSmANCZYaxHZnbzCGCcnr37w8Isn2iqrsoZIx79W7bhtlZZm7w7iout9EtNmNabgl0gISEqu0x1Ep1eJuRmqk0oEoxRvdGy2Nkl3t0LRBoF9ItRLCtukUbhNzYKsGNTRDLOHpXGgbMaYWCG1QmG2HnqjDF8VoqNmXqLgt1zvu8/ulPP718mcAlkWzRQBphLWO0uLvcmzDHkfleLZ83QRRRtXOZRYR3wdxBli4V5hHdqNI0xn1iZ1NuktxhSxWkmSOFwG0YSHPGsNc5OUqoYfa83EuoxAh3q70bZmZuxMpNNBFXtaCS3Ie6YgBOp5P0KCibFe7EFPMjK2QW2Fsm7g2HQUgU4RA6a46R2PsSTDCETaANAZS2DDJzuJb0SlgcuReMwZG95eZAd0qU7FLeEVm7t9xsZTUxjHTPRyXLaKvFAiyAVIW82chus8jqqy6tDjNyNf3l5WVdjzFpYPgR0eEcY6hx7QLqmEdrg3YbkVkposPnBss4a2VBTpuTjKrNEe7o2+thQaxdVixrFsxNZhjvHx9N7otvb+va7Gqj0SJciTpoFjYmJMvsOaJ6SRZ0er7e636PEdMHVVaZdKuWme0reRgBL4SxjJWiCEomlQrpjGd5phIdVhRbEhAUmkl6FwB3SkQ3aDIAbgGmmmTXFo1qAeauboMBBiujd6uNJgcL6m64vJUIcyJ3ucvce6XHLEhZNJEhwQ0NtpUaJhq5s5uiyclJW1sF2GBnjTB0xOjKokc4JEAU0CZ2O0YjRTeBRmpt1f0WcdiXL4d5elguwSA0DVZkuMnTCRnU1l5dQZtTKbiR8gbK3IqGbEhmZsbc2yXAlVa9KQ46stPRtW3chNPoz58iUq0mjTFGmZmJmQkzSbhO0DiidnmYqjYqQPPYtTycoLrYTJZQRKo8CQqybinmoepUznmQ7GoQMgs4w1RtjmYHsLtlXlmHAGv3iWRDpavNRiu7OsLpbZQklwoAQVZL1qyYzcVlQW30ATOvSgfbXI0hJNtcIau27m3hWdaVcCt4jL72mmYxb5nVTDPrktNbyYgEu7eXwwsg6LsEYsBFyWAwGdd1WgTZFqAZjdZq2s589lFm3IWIsfYSMDmyYRathIA28MomucsgCSWzjgjRS6Qwb0flJo6trNA0FmgqutkGjF0it90+uSjC5AVRCZkBWXXMyFxx8zztfOQ4bo1HGMNcncftBSVSJKD2sFIRIIOH0oLdlFRXoY3WXbfDS7GV1qrac46+WAYCQSYButN35bQh9rBZW6LMHDKbrN1FRfj5SHekmhCHBViqbs3XT+z04+iFMH/98hrnkrCuq3PRg5IBjnjsaxZl9Vg7dpxvexzhzvNxqVMjCbvfDwpz8JgzPt9sd3fTeu3d9EfWjdtvXrvaLvIg7Drbo+0YMfj9x/X2Y9//+OXm1rf6/uP79x9vRr+H02ggfMSr51WmtBE3HHnWv//33273Kduff379/Dke76u97na8vfW4jU/3+PHb347x+fPn+/FS1Ht9fGzDcL/9+ZZ7PX58+PB/+s9/+vUv73T888unt2/27//9l59//gOwMld97fmH2LrcPK+9mGa0UFXPaRFO+c4cI7oWD8WUus3Z1JgvzXYOUQDV+HhoLZ+YzXX29fX719fXzwWd18fm9enwP365v37+csTr99v1/cd2vP76lt++9uusn/94zNvHH/6Iro+3t8rry+vtnt3nR8rpYMRlymx1TcPnjx9a31bw4+/+dNN+f73F/T/904+//Tqm3Q5+OeYfP/ELY317vH1b1/L3zOrr2ykqNz6I4y+/fnt8uNndR91uEb6Ogy3/y1/e1lUq/OGP5+ePqPwI4H6b4x7rHG/vH5z3iHg04oiza1/ry8unf/oU39/Pa9Xef5WsaXPi7bdvr1/+OP/4ej7eL54v4y62FvfyahoqjNLejRvRV5X1dN5vA7p2XlCNablaqBETqAPj1BWYu5do6pCXiUFG88YbRdnVXWr04IDntVXZstc536530o3WhhgzhFZkF8liA+l9yDj91rXLhkup6izN6cqYs9YlOnK5x96XQAIcYavPfXU1fWDvsBt8n+dJmiOgXNeGtR9eKbgn2mfkYz0FCybJlrrJSsZwVreM1S1IPZ3aO8FJ4xhVe0PDI7tB89m1eNBXbh/BKnSa2ZXNLrOx0aBN80TJ+4jZzexrjFnaUNm4yaAq92jT5KhOI9CUUylBwSFb6OpGabNBGsnDhoTE7lbbdJJWNHTB3GplhIveLLdwsmVOuKi2a9dwmYdMnWkRXY+scHJnGowkSYEpGFBWJAxsa1SXiUJmm3vLxAYxAHeI9I4iHehGF2hqYV2njwGSa8HVOah8dY8ws2pBXTILcwkQRHV3WnocBNlQ7xHTzXclinIFcR+vbWokjY0iRVlMqmi
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x114DF1DF0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# print the original image\n",
"print(generated_image_filepath)\n",
"display(Image.open(generated_image_filepath))\n",
"\n",
"# print the new variations\n",
"for variation_image_filepaths in variation_image_filepaths:\n",
" print(variation_image_filepaths)\n",
" display(Image.open(variation_image_filepaths))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Edits\n",
"\n",
"The edit endpoint uses DALL-E to generate a specified portion of an existing image. Three inputs are needed: the image to edit, a mask specifying the portion to be regenerated, and a prompt describing the desired image.\n",
"\n",
"**Required inputs:** \n",
"- image (str): The image to edit. Must be a valid PNG file, less than 4MB, and square.\n",
"- mask (str): An additional image whose fully transparent areas (e.g. where alpha is zero) indicate where `image` should be edited. Must be a valid PNG file, less than 4MB, and have the same dimensions as `image`.\n",
"- prompt (str): A text description of the desired image(s). The maximum length is 1000 characters.\n",
"\n",
"**Optional inputs:**\n",
"- n (int): The number of images to generate. Must be between 1 and 10. Defaults to 1.\n",
"- size (str): The size of the generated images. Must be one of \"256x256\", \"512x512\", or \"1024x1024\". Smaller images are faster. Defaults to \"1024x1024\".\n",
"- response_format (str): The format in which the generated images are returned. Must be one of \"url\" or \"b64_json\". Defaults to \"url\".\n",
"- user (str): A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse. [Learn more.](https://beta.openai.com/docs/usage-policies/end-user-ids)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Set Edit Area\n",
"\n",
"An edit requires a \"mask\" to specify which portion of the image to regenerate. Any pixel with an alpha of 0 (transparent) will be regenerated. The code below creates a 1024x1024 mask where the bottom half is transparent."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# create a mask\n",
"width = 1024\n",
"height = 1024\n",
"mask = Image.new(\"RGBA\", (width, height), (0, 0, 0, 1)) # create an opaque image mask\n",
"\n",
"# set the bottom half to be transparent\n",
"for x in range(width):\n",
" for y in range(height // 2, height): # only loop over the bottom half of the mask\n",
" # set alpha (A) to zero to turn pixel transparent\n",
" alpha = 0\n",
" mask.putpixel((x, y), (0, 0, 0, alpha))\n",
"\n",
"# save the mask\n",
"mask_name = \"bottom_half_mask.png\"\n",
"mask_filepath = os.path.join(image_dir, mask_name)\n",
"mask.save(mask_filepath)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Perform Edit\n",
"\n",
"Now we supply our image, caption and mask to the API to get 5 examples of edits to our image"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"created\": 1667611683,\n",
" \"data\": [\n",
" {\n",
" \"url\": \"https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-F5XQFFBLrN7LdXuG5CkQJpxr.png?st=2022-11-05T00%3A28%3A03Z&se=2022-11-05T02%3A28%3A03Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T02%3A06%3A29Z&ske=2022-11-05T02%3A06%3A29Z&sks=b&skv=2021-08-06&sig=2UhH%2BkKdvDVoRcgWJhmNFVzpvLzBAZpnA/tU80Zc8M0%3D\"\n",
" }\n",
" ]\n",
"}\n"
]
}
],
"source": [
"# edit an image\n",
"\n",
"# call the OpenAI API\n",
"edit_response = openai.Image.create_edit(\n",
" image=open(generated_image_filepath, \"rb\"), # from the generation section\n",
" mask=open(mask_filepath, \"rb\"), # from right above\n",
" prompt=prompt, # from the generation section\n",
" n=1,\n",
" size=\"1024x1024\",\n",
" response_format=\"url\",\n",
")\n",
"\n",
"# print response\n",
"print(edit_response)\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# save the image\n",
"edited_image_name = \"edited_image.png\" # any name you like; the filetype should be .png\n",
"edited_image_filepath = os.path.join(image_dir, edited_image_name)\n",
"edited_image_url = edit_response[\"data\"][0][\"url\"] # extract image URL from response\n",
"edited_image = requests.get(edited_image_url).content # download the image\n",
"\n",
"with open(edited_image_filepath, \"wb\") as image_file:\n",
" image_file.write(edited_image) # write the image to the file\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/generated_image.png\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAIAAADwf7zUAAAAaGVYSWZNTQAqAAAACAACknwAAgAAACkAAAAmkoYAAgAAABgAAABQAAAAAE9wZW5BSS0tZWI0ZDYxMjFhZTE3YzljZTQ2YTQ5MmY5NjA3MDJkZTMAAE1hZGUgd2l0aCBPcGVuQUkgREFMTC1FAFblrbQAAQAASURBVHicNP3JsjRJkqWJHR5EVNXs3n/w390jPDIih8qqrgaIgEUvmpoIb4U3wnPgFbAACAAVqrqGzKyMwSP8H+5gpqoizHywuFF7W5gZqQqz8DnnY/m//9/+r2kpbK5SkcipyBKVBsJJghzH7Ou2uk+kFqNEIK35mEeKSSIz1OjAyOP1NXrv4wwVtGbHPBdr6M2GHBHkdGsEYlRbJAoFMopVKhoiiVrRC8WCNT9mVmZlLIu13g22H68Uc5URnHO2btd1BUKtZeWMYKV7vx/72hchgqmuKHMKXQQUUyPmPL13RNJ9xFAa3RgoQx6jraKUrbM36Vai1fval7evretyjZL7nSP19Zj76efEOaOt28ePHx8+fGjuEJ0RAiJmMokYSWRmlltbXCOrIlQbGNYaWjMgVY/9iIjWrJk8WPv+u+3DxZaNS+tAT0SOaWt3e5d9IYo5VHje4+XL/vzlfr+PmlrIiCNG3Pe7wI6S5cP3//7//L/8zd//T760pi4CUEkkJrSSwDyrYj+f95cnyeq8ff3y83/6//6H//LffzlCxjFN2bZ27JkVSTNoGhVkZLM+6hRCBHMERLpbqS2iBJiZIIVSlFY5xXtHMgUojiyp0rVLlcOt6ayoSBHNLDJprVBb6wrtq334/kO3/ro/b2bneXRfr48Xltyfn59nNBappsKogWqu6eZiyVAo1BC5j6m0BLVkyqi0YC19+fTh8Tc/ft83z8w45+u3b68vtwpqs9uMyDiDofM8oi3bZblkRrIAmJokp6QRbB7H7Fvr67KsulyXhdbcl7W9e/y49k0WOzNMjWOYGQT77X7u+/04kTyOfZ4zrXKyNe/bZg4REVUTRg4hjvvYX1/313kcZ0AJWdwnS81cnK4KgNAmIm1EEWmgu5u0qoA6mICsvWWWuizXy/uH99t1e7y+s+bdWu9eVOveVl/b6t6BNPjIhLKSUGUUrSJYMccco+J4uf33P/zp+PpcpACpKGHMQhKIBEyUIpEpLGtaozJpKkoXI1WSXNRPhgGiNsckTBoarDiRyhVNFlaNY0gzM8ccAZibkLNqhYcRpKaWlytn1Bm1uhMkSsQzpqlSgHJhjTpVTETJaCpIhUpkUMqlp4ipxRjSxdnnHL37cU41AeTtAYdIJQFVNVZSaEoTU3f3tUBEQYqJUgGEJhVFHu5dIqgoGAr7uUvo1AKrzigHYrrqeeY0emmClgUKa0gzk1aoILWEIktXiJnD2xrH9GZRMHWBlBGsNDU0kZozojhzoOjWeM48x8x7s14ECrY4BE09M8ccWWVL700Hp3tb1VGzm48qwlMQY7rIom3UfD3vfd3MrUpgyCwhY58iuix2jhLRZmrNU9LgLJlzjDnXZW1NaE2BjDPLurkZSY5KgyGjuQkrs97eZ3jVFHEAIpACFS0yQMCkiQ3QimAVyqEzZ85qzWdFd581ISZFCpmg4NIWdRvjPEZYpagcNVszFZ9RTUDRS+8hkhEzw1xBjvNc2uomPFLNul/gWWpBdFvcW5w7VDgGATLdTUVGDqRc162r0zUzTOvcR/MOyh1z1ZYxX8cEeB77YsfHh/X64Oc4KUrhfj992eiXTNxfnntblsXHZF99Ts3yVK9ztgUxZgVbX9y0KArN5CyK6IhcXKqwLNvEsbZNk58//wLh48O69M2bxDy5n9b9x08/qMoR8/n1tVs/GKt2N9SIvvSH9x++PT8fT6/b4/Xl5eX++vq3f/vb9+8ehPnp03f/+sd//dc//XLeb6u3Tz/++pcvf7bWX375muSvv//pfruf57FelxPyp6+/bOv1hw/fzeM8Xr7GmJbnrGpre1wfpPD0cld1XXzTy+t+e/i49d6Ncsau1v/23/3D+vBI4C9//MN/+0//n9bb47tP6Otv//H/eF0e/vN/+P99/vPnv/u73/RtOY65327355dvz9+O15fb85f96xfOJ8W8LPHpk16X2eUulvsoVlJT1JtYYHTrprbPQ2lUpSDSBJJ0E4W3EvG2LOu78nfL8lG299vlg6/vbLlevvsh7/ly22/j/vnLPWNu61VZ3tZmvRm8NVblKFtcXeN+R+D9x3frdunt8unjx9/+7W/c9T6OGDmzjvOUjErsc4y3x3cO71pZIiRVSDMjMuecMcwoiIsvs3Kcp7nPGVAwK2u6LdqbCrvqtr6ztY8xb7fXfQxXVMHFem/J03QBuEeOeXZrESNnnTUqz4qcOaOmJFVazoDMKpyRkSMjM6WYMSJKREuVcexfnp+P59d9381ExZFSzt5X266Pl/dQCYYII6KhlXDm1KJ0wZniNmKaaEBzDAVChmFV8xkDM6RbZQlo1jCjhDNCpFiqQJLWbYzT3F1NVEGpMQiFICozcrl0RM0xVRtRrlZCgUalUSIz4pRS6Z5ZzgyUmGWGihOSOVUVVQQE6opKUCxruoLw5ASlBAqRCpamJRlNeiRhkvNcvY2Mt7qjEEJAaFrWMPcEZwUKbjqjmgFH1VLEApaKAkwpglbiI49GZR5sXoQ65wjx2vx6sjjgZsuma/eqYuZZ7NoE4mq1tJohTbdt22+3KUm69qrM1oxgWXY2Ci1ABQAICjTIRMaAqRtAUV1a5pBRW1+KqCywIjhnznM8XB9cmVEzzkxEFE0J7evW1z7HKQLngMpqPbxqppuq6DHO1pVZimRbXfU4XjWN0iV9jtLmRlg1cUD15ECINmsLFmqMpGZ1ufTVDFWyXq9Aez3z9nrMqNYfVMzVb9yHKWLebi/9skWykKreBOarzjMremKkaAWA0KWiSMuxp6gVZCaXHhV0cV8VjDFf1+LT6xztExfaWX6KiUjxpFx2zcoCpVCx+DLWTL0rK1BIc3VpuNKQ0rGoNXMlpqSXpAEMslGoQoxxBzLOmfd7FptgDjTflu3a9HOKyqWv3s4oWqQ4omaGiZWA4jMK0OTcvOtmcc5JOjkrqxKAow2c3b3K1WSOUDBTU0rUUkVmJuEthdohZX2S5hC1MYeKFqoyNXk831/q2cRjEZV2jmN8PiIx52QVt2vOSKI195lJWKm5oxBkHFPJrrZXQPTIkqQ27c1M4asv3be+7sf9Zb9lVGaygDJvUujMIbpetoS0GYdQvDUG9/Nczd0VWUwu2+KAk0K5aKOwr2hNzVUvvXIu1iiazhgnUULNmRF5jpFVEWVqS6P11kwqRS+r1swIVWVUI18mCSEtssRMXDQVQCBNG5E1aw4xDQhFHZkxCQSaCKDaZObMat7P8+yNY44eS2U4IN4hKmqsAFaxLkAmJk8zc8ikgjTXorBV0qysxoiCCVT1th9bd5CVtIxUnwF1qmgUXJAQJlDpvbEoyAR6Kg0FMShIrXJTlGTMEooW1HLy9B1TfWmV5BglMFUpEm46J4kQSmlnjAgpp65dClCoposytUECKYhZjuZec5p7wMHIqmZqbqAIoUScQ10keNbpIjFCODNU1KRKmlaISlUlJEVcUEo17RBlVLBEaKSpw1SYZ6Q1AZZ5jNZMqMgcmSRJgshZMBWBqjraFOlVRDpZUhV0MykVSxHt2kadi/pR87K0mQycq3mUqlB7zeTq6ySNaaRCgqwZappMTaFKCJkya0IE5HgdzbUMI6q7JypjTu3WN0cGw0RDIJD9PEWMqIScMY46pfVSm1lCzZxC1CgpapOKt7InZFbR8NZ31xyjNV9cRVuhmCXeW6KUVWxqTowKmaEikSEqArFmRINP03a/7+bWe89RIuJdFToizTQRzBThWcHKUsyZcExWhYmgmZXIPW7ufpzDtI+YFCQl9mDLTDezbpoVEXGrUpoqhYiZ7tK8qUpMfLq8+/t/+Mf/8vt/+vPX27b2vqwPj9fX1+dzjkUVzRDDAGZOStOlDCzh4uoUKMjVKue
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x114C6F7C0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"./images/edited_image.png\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1024x1024 at 0x119526A30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# print the original image\n",
"print(generated_image_filepath)\n",
"display(Image.open(generated_image_filepath))\n",
"\n",
"# print edited image\n",
"print(edited_image_filepath)\n",
"display(Image.open(edited_image_filepath))\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.9 ('openai')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.9"
},
"vscode": {
"interpreter": {
"hash": "365536dcbde60510dc9073d6b991cd35db2d9bac356a11f5b64279a5e6708b97"
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}