{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport cv2\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# create list of all directories\nbase_dir = '/kaggle/input/alaska2-image-steganalysis/'\nimage_dirs = ['Cover','JUNIWARD', 'JMiPOD',  'UERD']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = {}\n\nfor image_dir in image_dirs:\n    if image_dir==\"Test\":\n        continue\n    images = []\n    for file in os.listdir(os.path.join(base_dir, image_dir)):\n        images.append(file)\n    data[image_dir]=images\n\ntrain_df = pd.DataFrame(data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**JUNIWARD JMiPOD** and **UERD** are steganography algorithms that are used to hide information in images"},{"metadata":{"trusted":true},"cell_type":"code","source":"def similarity_test(df):\n    similarity = set(df['Cover'] == df['JUNIWARD'])\n    similarity = similarity | set(df['Cover'] ==df['JMiPOD'])\n    similarity = similarity | set(df['Cover'] ==df['UERD'])\n    return similarity\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"similarity_test(train_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_id_1 = 41731\nimage_id_2 = 12314\nimage_id_3 = 28962\nimage_id_4 = 127\nsample_images_1 = [base_dir + x[0] +'/'+x[1] for x in zip(list(train_df.columns) , list(train_df.iloc[image_id_1,:]))]\nsample_images_2 = [base_dir + x[0] +'/'+x[1] for x in zip(list(train_df.columns) , list(train_df.iloc[image_id_2,:]))]\nsample_images_3 = [base_dir + x[0] +'/'+x[1] for x in zip(list(train_df.columns) , list(train_df.iloc[image_id_3,:]))]\nsample_images_4 = [base_dir + x[0] +'/'+x[1] for x in zip(list(train_df.columns) , list(train_df.iloc[image_id_4,:]))]\n\nsample_images_1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\nfor img,ax in zip(sample_images_1,axs):\n    ax.imshow(cv2.imread(img))\n    ax.set_title(img.split('/')[-2])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"multiplier = 10000 # This is used to brighten the diffrential image\n\n_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\n\nCover = np.array(cv2.imread(sample_images_1[0]))\nfor img,ax in zip(sample_images_1, axs):\n    if 'Cover' in img:\n        ax.imshow(Cover)\n        ax.set_title('Cover')\n        continue\n    image = np.array(cv2.imread(img))\n    new_image = (Cover - image)*multiplier\n    ax.imshow(new_image)\n    title = img.split('/')[-2] + ' differential'\n    ax.set_title(title)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\n\nCover = np.array(cv2.imread(sample_images_2[0]))\nfor img,ax in zip(sample_images_2, axs):\n    if 'Cover' in img:\n        ax.imshow(Cover)\n        ax.set_title('Cover')\n        continue\n    image = np.array(cv2.imread(img))\n    new_image = (Cover - image)*multiplier\n    ax.imshow(new_image)\n    title = img.split('/')[-2] + ' differential'\n    ax.set_title(title)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\n\nCover = np.array(cv2.imread(sample_images_3[0]))\nfor img,ax in zip(sample_images_3, axs):\n    if 'Cover' in img:\n        ax.imshow(Cover)\n        ax.set_title('Cover')\n        continue\n    image = np.array(cv2.imread(img))\n    new_image = (Cover - image)*multiplier\n    ax.imshow(new_image)\n    title = img.split('/')[-2] + ' differential'\n    ax.set_title(title)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Histogram of Oriented Gradient** is a feature descriptor that is used to extract features from image data. The HOG descriptor focuses on the structure or the shape of an object. The HOG feature descriptor counts the occurrences of gradient orientation in localized portions of an image."},{"metadata":{"trusted":true},"cell_type":"code","source":"from skimage.feature import hog\n\ndef hog_image(img):\n    img=img[:,:,1] \n    fd, hog_image = hog(img, orientations=8, pixels_per_cell=(4, 4),cells_per_block=(2, 2), visualize=True)    \n    return hog_image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\nfor img,ax in zip(sample_images_4,axs):\n    ax.imshow(hog_image(np.array(cv2.imread(img))))\n    ax.set_title(img.split('/')[-2])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_, axs = plt.subplots(1, 4, figsize=(12, 12))\naxs = axs.flatten()\n\nCover = np.array(cv2.imread(sample_images_4[0]))\nfor img,ax in zip(sample_images_4, axs):\n    if 'Cover' in img:\n        ax.imshow(hog_image(Cover))\n        ax.set_title('Cover')\n        continue\n    image = np.array(cv2.imread(img))\n    new_image = (Cover - image)\n    ax.imshow(hog_image(new_image))\n    title = img.split('/')[-2] + ' differential'\n    ax.set_title(title)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"From the above plots, we can see that these different steganography algorithms are used to change/hide certain features of the image.\n\nMoreover, these hidden features could contain important information that could be leveraged."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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}