{"id":16634828,"url":"https://github.com/amir78729/numpy-image-manipulation","last_synced_at":"2026-04-18T20:32:51.621Z","repository":{"id":115877636,"uuid":"280876587","full_name":"amir78729/numpy-image-manipulation","owner":"amir78729","description":"Linear Algebra course - Final Project","archived":false,"fork":false,"pushed_at":"2020-10-15T13:03:03.000Z","size":3299,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-11T23:44:01.715Z","etag":null,"topics":["linear-algebra","numpy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amir78729.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-19T13:57:19.000Z","updated_at":"2023-05-21T16:00:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"cb76a46a-e77e-4098-b2b2-e1053e4c0229","html_url":"https://github.com/amir78729/numpy-image-manipulation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/amir78729/numpy-image-manipulation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2Fnumpy-image-manipulation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2Fnumpy-image-manipulation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2Fnumpy-image-manipulation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2Fnumpy-image-manipulation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amir78729","download_url":"https://codeload.github.com/amir78729/numpy-image-manipulation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2Fnumpy-image-manipulation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31984135,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"ssl_error","status_checked_at":"2026-04-18T20:23:29.375Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["linear-algebra","numpy"],"created_at":"2024-10-12T05:48:20.412Z","updated_at":"2026-04-18T20:32:51.589Z","avatar_url":"https://github.com/amir78729.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# numpy image manipulation\n\n### \u003cdiv dir=\"rtl\"\u003eشرح پروژه \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nدر بسیاری از مسائلی که در حوزه ی پزشکی ، اقتصاد و ... مطرح میشود برای حل مسئله و تصمیم گیری\nدرمورد موضوع مورد نظر نمونه گیری هایی از جامعه مورد سوال انجام میشود بعنوان مثال در حوزه ی پزشکی\n، محیط زیست ، امنیت یا مدیریت شهری ؛ در بسیاری از مواقع نیاز به عکس برداری از نواحی مختلف با\nاستفاده از دستگاه های مختلف است این عکس ها بصورت ماتریس ذخیره میشوند. یک عکس بطور دارای\n۲۰۰۰ در ۲۰۰۰ پیکسل است بنابراین یک عکس بطور معمول دارای ۴ میلیون پیکسل میباشد که بصورت یک\nماتریس با ۳ سطر و ۴ میلیون ستون ذخیره میشود. در هر بررسی این داده ها داده ی خام مسئله هستند که\nمورد استفاده مستقیم قرار نمیگیرند بلکه عملیات هایی بر روی اطلاعات اولیه انجام میشود که داده را آماده\nی استفاده برای مراحل حل مسئله میکند. به مجموعه ی این عملیات ها پیش پردازش میگویند.\nیکی از راه های پیش پردازش داده ها استفاده از مفاهیم آماری چون میانگین ، واریانس و ... میباشد.\n \u003c/div\u003e\n\n### \u003cdiv dir=\"rtl\"\u003e مراحل پروژه \u003c/div\u003e ###\n\n#### \u003cdiv dir=\"rtl\"\u003e یک عکس از ناحیه ی مورد نظر خود بگیرید   \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nدر ابتدای برنامه با صفحه ی زیر مواجه خواهیم شد:\n\u003c/div\u003e\n\n```\nHi! How do you want to work with this \nprogram?\n 1 - using ready image\n 2 - using another image\n-1 - exit the program\nplease enter your choice:  \n```\n\n\u003cdiv dir=\"rtl\"\u003e\nبا انتخاب 1 و 2 نوع ورودی دادن به برنامه مشخص خواهد شد بعد از انجام عملیات روی عکس (در صورت وجود در پوشه موردنظر که خود فایل پروژه هم در آن قرار دارد) تا زمانی که ورودی 1- را به برنامه ندهیم برنامه اجرا خواهد شد و عکس ها را بصورت متوالی از ما دریافت خواهد کرد. عکسی که به صورت پیشفرض برای برنامه در نظر گرفته شده است عکس زیر میباشد:\n \u003c/div\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://cdn.discordapp.com/attachments/732234196487241741/734420271972220959/1.jpg\"\u003e\n \u003c/p\u003e\n\n#### \u003cdiv dir=\"rtl\"\u003e آن را بصورت ماتریس ذخیره کنید.  \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nپس از انتخاب عکس آن را به کمک تغییر اندازه به یک عکس 2000×2000 پیکسل تبدیل میکنیم(واضح است که اگر عکسی در ابتدا  بصورت مستطیلی باشد، پس از این عملیات بصورت عمودی یا افقی فشرده خواهد شد تا بصورت مربعی تبدیل شود، مانند شکل زیر که فشرده شده ی عکس بالا میباشد).\n \u003c/div\u003e\n \u003cp align=\"center\"\u003e\n\u003cimg src=\"https://cdn.discordapp.com/attachments/732234196487241741/734420298245603338/2.jpg\"\u003e\n \u003c/p\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nسپس آرایه ای دو بعدی از عکس ورودی میسازیم\n \u003c/div\u003e\n \n```python\nimage_matrix = np.array(image) \nimage_matrix.resize((h * w, 3)) # h = w = 2000 \n```\n\n\u003cdiv dir=\"rtl\"\u003e\nدر آرایه‌ی دو بعدی به دست آمده هر یک از ۴۰۰۰۰۰۰ سطر متعلق به یکی از پیکسل های عکس ورودی خواهند بود و هر کدام از این پیکسل ها سه مولفه خواهند داشت که میتوانند رنگ پیکسل را بر اساس سه رنگ قرمز و سبز و آبی بیان کنند.\n \u003c/div\u003e\n \n#### \u003cdiv dir=\"rtl\"\u003e ابرداده های آن را رسم کنید. \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nبرای ترسیم ابرداده ها تابعی مانند زیر تعریف میکنیم:\n \u003c/div\u003e\n\n```python\ndef print_metadata(image):\n    has_metadata = False\n    exifdata = image.getexif()\n    for tag_id in exifdata:\n        tag = TAGS.get(tag_id, tag_id)\n        data = exifdata.get(tag_id)\n        # decode bytes\n        if isinstance(data, bytes):\n            has_metadata = True\n            data = data.decode()\n        print('   \u003e\u003e\u003e',f\"{tag:25}: {data}\")\n    return has_metadata\n```\n\n\u003cdiv dir=\"rtl\"\u003e\nنکته‌ای که در این مورد لازم به ذکر میباشد این است که لزوما تمامی عکس ها دارای ابرداده نمیباشند. به عنوان مثال عکس پیش‌فرضی که در این گزارش استفاده شده است فاقد این اطلاعات است و معمولا عکس هایی ابرداده دارند که توسط دوربین گرفته شده اند. به عنوان مثال عکس زیر با دوربین موبایل گرفته شده است:\n \u003c/div\u003e\n \u003cp align=\"center\"\u003e\n\u003cimg src=\"https://cdn.discordapp.com/attachments/732234196487241741/734420304050520104/3.jpg\"\u003e\n \u003c/p\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nین عکسی است که دارای ابرداده میباشد. بنابراین با فراخوانیِ تابع ساخته شده، اطلاعات مربوط به این عکس به صورت زیر نمایش داده خواهد شد(این عکس هم در پوشه ی فایل قرار دارد و با در آوردن خط کد مربوط به آن (خط ۱۲۶) از حالت کامنت قابل دسترسی است):\n \u003c/div\u003e\n \n```python\n\u003e\u003e\u003e Q3: META DATAS :\n   \u003e\u003e\u003e ExifVersion              : 0220\n   \u003e\u003e\u003e ShutterSpeedValue        : (564, 100)\n   \u003e\u003e\u003e ApertureValue            : (252, 100)\n   \u003e\u003e\u003e DateTimeOriginal         : 2020:07:19 11:59:14\n   \u003e\u003e\u003e DateTimeDigitized        : 2020:07:19 11:59:14\n   \u003e\u003e\u003e BrightnessValue          : (282, 100)\n   \u003e\u003e\u003e ExposureBiasValue        : (0, 10)\n   \u003e\u003e\u003e MaxApertureValue         : (116, 100)\n   \u003e\u003e\u003e MeteringMode             : 3\n   \u003e\u003e\u003e Flash                    : 0\n   \u003e\u003e\u003e FlashPixVersion          : 0100\n   \u003e\u003e\u003e FocalLength              : (430, 100)\n   \u003e\u003e\u003e UserComment              :\n   \u003e\u003e\u003e ColorSpace               : 1\n   \u003e\u003e\u003e ComponentsConfiguration  : \n   \u003e\u003e\u003e ExifImageWidth           : 4032\n   \u003e\u003e\u003e SubsecTime               : 0756\n   \u003e\u003e\u003e SubsecTimeOriginal       : 0756\n   \u003e\u003e\u003e SubsecTimeDigitized      : 0756\n   \u003e\u003e\u003e ExifImageHeight          : 1960\n   \u003e\u003e\u003e ImageLength              : 1960\n   \u003e\u003e\u003e Make                     : samsung\n   \u003e\u003e\u003e Model                    : SM-N960F\n   \u003e\u003e\u003e Orientation              : 1\n   \u003e\u003e\u003e YCbCrPositioning         : 1\n   \u003e\u003e\u003e ExposureTime             : (1, 50)\n   \u003e\u003e\u003e ExifInteroperabilityOffset: 815\n   \u003e\u003e\u003e XResolution              : (72, 1)\n   \u003e\u003e\u003e FNumber                  : (240, 100)\n   \u003e\u003e\u003e SceneType                : \n   \u003e\u003e\u003e YResolution              : (72, 1)\n   \u003e\u003e\u003e ImageUniqueID            : J12LLKL00SM\n   \u003e\u003e\u003e ExposureProgram          : 2\n   \u003e\u003e\u003e CustomRendered           : 0\n   \u003e\u003e\u003e ISOSpeedRatings          : 100\n   \u003e\u003e\u003e ResolutionUnit           : 2\n   \u003e\u003e\u003e ExposureMode             : 0\n   \u003e\u003e\u003e ImageWidth               : 4032\n   \u003e\u003e\u003e WhiteBalance             : 0\n   \u003e\u003e\u003e Software                 : N960FXXU5ETF5\n   \u003e\u003e\u003e DateTime                 : 2020:07:19 11:59:14\n   \u003e\u003e\u003e DigitalZoomRatio         : (0, 0)\n   \u003e\u003e\u003e FocalLengthIn35mmFilm    : 26\n   \u003e\u003e\u003e SceneCaptureType         : 0\n   \u003e\u003e\u003e Contrast                 : 0\n   \u003e\u003e\u003e Saturation               : 0\n   \u003e\u003e\u003e Sharpness                : 0\n   \u003e\u003e\u003e ExifOffset               : 225\n\n```\n\n\u003cdiv dir=\"rtl\"\u003e\nولی در مورد عکس اصلی پیام عدم وجود ابرداده مشاهده خواهد شد.\n \u003c/div\u003e\n \n #### \u003cdiv dir=\"rtl\"\u003e  میانگین داده ها را بیابید  \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nبا توجه به فرمول زیر میانگین را باید محاسبه کنیم و با کمک آن تابع زیر را تعریف میکنیم: \n \u003c/div\u003e\n \n\n\n\n\u003cp align=\"center\"\u003e\n \u003cimg src=\"https://latex.codecogs.com/gif.latex?M=\\frac{x_1+...+x_n}{n}\"\u003e\n\u003c/p\u003e\n\n\n```python\ndef calculate_mean(img):\n    n = img.shape[0]\n    mean =[[.0 , .0 , .0]]\n    for pixel in range(img.shape[0]):\n        mean = mean + img[pixel]\n    mean = mean / n\n    return mean\n```\n\n\u003cdiv dir=\"rtl\"\u003e\nکه خروجی این تابع  بردار میانگین خواهد بود.\n \u003c/div\u003e\n\n#### \u003cdiv dir=\"rtl\"\u003e با استفاده از قسمت ۴ ، ماتریس کوواریانس را بسازید.  \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nبا رابطه ی داخل کتاب و همچنین داخل گزارش پروژه میتوان ماتریس کوواریانس را محاسبه کرد.\nبرای همین موضوع تابع زیر را تعریف میکنیم که عکس و میانگین را به عنوان آرگمان میگیرد و خروجی آن ماتریس کوواریانس خواهد بود:\n \u003c/div\u003e\n\n```python\ndef calculate_covariance_matrix(img, m):\n    n = img.shape[0]\n    B = img\n    for pixel in range(img.shape[0]):\n        B[pixel] = B[pixel] - m\n    B = B.transpose()\n    s = (B.dot(B.transpose()))/(n-1)\n    return s\n```\n\n#### \u003cdiv dir=\"rtl\"\u003e مقدار واریانس و همبستگی داده ها را محاسبه و بر اساس مقدار به دست آمده آن را تحلیل کنید.  \u003c/div\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nبا توجه به صفر بودن یا نبودن درایه های ماتریس کوواریانس تعیین میکنیم آیا وابستگی بین رنگ ها وجود دارد یا خیر. بعنوان مثال:\n \u003c/div\u003e\n \n```python\n\u003e\u003e\u003e Q6: COVARIANCE MATRIX ANALYSIS:\n   \u003e\u003e\u003e COVARIANCES ANALYSIS:\n      \u003e\u003e\u003e COV( X 1 , X 2 )= 0.0         -\u003e      X 1 and X 2 are UNCORRELATED.\n      \u003e\u003e\u003e COV( X 1 , X 3 )= 0.0         -\u003e      X 1 and X 3 are UNCORRELATED.\n      \u003e\u003e\u003e COV( X 2 , X 1 )= 0.0         -\u003e      X 2 and X 1 are UNCORRELATED.\n      \u003e\u003e\u003e COV( X 2 , X 3 )= 0.0001\n      \u003e\u003e\u003e COV( X 3 , X 1 )= 0.0         -\u003e      X 3 and X 1 are UNCORRELATED.\n      \u003e\u003e\u003e COV( X 3 , X 2 )= 0.0001\n   \u003e\u003e\u003e VARIANCES ANALYSIS:\n      \u003e\u003e\u003e VAR( X 1 )= 0.0\n      \u003e\u003e\u003e VAR( X 2 )= 0.0\n      \u003e\u003e\u003e VAR( X 3 )= 0.0001\n```\n\n#### \u003cdiv dir=\"rtl\"\u003e داده ای که در حال حاضر با آن کار میکنید 3 بعدی است. آیا بعد آن را میتوان کاهش داد؟ برای این منظور از روش واریانس کل داده ها استفاده کنید  \u003c/div\u003e \n\n \u003cdiv dir=\"rtl\"\u003e\n واریانس کل را محاسبه میکنیم و مقادیر ویژه را بر آن تقسیم میکنیم:\n  \u003c/div\u003e\n  \n ```python\n def calculate_total_variance(variance_matrix):\n    total_variance = .0\n    for v in range(3):\n        total_variance = total_variance + variance_matrix[0][v]\n    return round(total_variance,2)\n```\n\n#### \u003cdiv dir=\"rtl\"\u003e با استفاده از روش analyze component principle حداقل یک عکس جدید از ورودی خود تولید کنید   \u003c/div\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://cdn.discordapp.com/attachments/732234196487241741/734420313865191524/4.jpg\"\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famir78729%2Fnumpy-image-manipulation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famir78729%2Fnumpy-image-manipulation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famir78729%2Fnumpy-image-manipulation/lists"}