{"cells":[{"metadata":{},"cell_type":"markdown","source":"## ALASKA2 EDA: compare ateganography algorithm by simple subtraction.\n\nI don't know anything about steganography, then I tried to make a simple visualization."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"import os\nimport sys\nimport gc\n\nfrom pathlib import Path, PosixPath\n\nimport numpy as np\nimport pandas as pd\n\nfrom PIL import Image, ImageChops\n\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\n\n%matplotlib inline\n\nROOT = Path(\".\").resolve().parents[0]\nINPUT_ROOT = ROOT / \"input\"\nRAW_DATA = INPUT_ROOT / \"alaska2-image-steganalysis\"\n\nTRAIN_COVER = RAW_DATA / \"Cover\"\nTRAIN_JMiPOD = RAW_DATA / \"JMiPOD\"\nTRAIN_JUNIWARD = RAW_DATA / \"JUNIWARD\"\nTRAIN_UERD = RAW_DATA / \"UERD\"\nTEST = RAW_DATA / \"Test\"","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def read_image(image_id: str, image_dir: PosixPath):\n    with open(image_dir / image_id, \"rb\") as fr:\n        img = Image.open(fr)\n        img.load()\n    return img\n\ndef compare_image(image_id: str):\n    cover = read_image(image_id, TRAIN_COVER)\n    steganography = [\n        [\"JMiPOD\", read_image(image_id, TRAIN_JMiPOD)],\n        [\"JUNIWARD\", read_image(image_id, TRAIN_JUNIWARD)],\n        [\"UERD\", read_image(image_id, TRAIN_UERD)],\n    ]\n    fig = plt.figure(figsize=(24, 27))\n    for i, (name, ste_img) in enumerate(steganography):\n        ax_cov = fig.add_subplot(3, 3, 3 * i + 1)\n        ax_cov.set_title(\"Cover\", fontsize=22)\n        ax_ste = fig.add_subplot(3, 3, 3 * i + 2)\n        ax_ste.set_title(name, fontsize=22)\n        ax_sub = fig.add_subplot(3, 3, 3 * i + 3)\n        ax_sub.set_title(\"SUB(Cover, {})\".format(name), fontsize=22)\n        \n        ax_cov.imshow(cover)\n        ax_ste.imshow(ste_img)\n        sub_arr = np.asarray(cover) - np.asarray(ste_img)\n        ax_sub.imshow(Image.fromarray(sub_arr.astype(\"uint8\")))\n        \n\ndef compare_crop_image(image_id: str, crop_area):\n    cover = read_image(image_id, TRAIN_COVER)\n    cover = cover.crop(crop_area)\n    steganography = [\n        [\"JMiPOD\", read_image(image_id, TRAIN_JMiPOD)],\n        [\"JUNIWARD\", read_image(image_id, TRAIN_JUNIWARD)],\n        [\"UERD\", read_image(image_id, TRAIN_UERD)],\n    ]\n    fig = plt.figure(figsize=(24, 27))\n    for i, (name, ste_img) in enumerate(steganography):\n        ste_img = ste_img.crop(crop_area)\n        ax_cov = fig.add_subplot(3, 3, 3 * i + 1)\n        ax_cov.set_title(\"Cover\", fontsize=22)\n        ax_ste = fig.add_subplot(3, 3, 3 * i + 2)\n        ax_ste.set_title(name, fontsize=22)\n        ax_sub = fig.add_subplot(3, 3, 3 * i + 3)\n        ax_sub.set_title(\"SUB(Cover, {})\".format(name), fontsize=22)\n        \n        ax_cov.imshow(cover)\n        ax_ste.imshow(ste_img)\n        sub_arr = np.asarray(cover) - np.asarray(ste_img)\n        ax_sub.imshow(Image.fromarray(sub_arr.astype(\"uint8\")))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_image_ids = sorted(os.listdir(TRAIN_COVER))\ntrain_image_ids[:10]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### visualize whole picture"},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[2])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[3])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[4])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[5])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_image(train_image_ids[6])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### crop"},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[0], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[1], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[2], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[3], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[4], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[5], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"compare_crop_image(train_image_ids[6], (0, 0, 40, 40))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I'm not sure whether or not this comparison method is correct. However, these algorthms' results look quite diffrence for me.\n\nI suspect that some approach such as preparing a classification model for each algorithm is required."}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}