نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
مهدی دمیرچیلو

آموزش ماژول Operations on arrays در OpenCV

496

به نام خدا : ماژول Operations on arrays زیر مجموعه ای از ماژول Core functionality هستش؛ این ماژول شامل هر عملیاتی که بشه رو آرایه/ماتریس/تصویر ها اعمال کرد هستش!

آموزش ماژول Operations on arrays در OpenCV

 

توابع محاسبات بیتی :

1) تابع bitwise_and

1) تابع bitwise_and : محاسبه AND بیتی عناصر متناظر دو آرایه و یا یک آرایه و یک scalar.

تعریف تابع :

توضیح پارامترها :

  • src1 و src2 : آرایه های ورودی
  • dst : آرایه خروجی با اندازه و نوعی برابر با آرایه های ورودی.

 

کد نمونه : اگه درباره AND بیتی چیزی نمیدونید یه سرچی کنید، وگرنه کد زیر رو درست متوجه نمیشید؛ تو تصویر dst1 که همه پیکسل ها با صفر، اند بیتی میشن فلذا مقدار همه پیکسل ها 0 میشه ( به خاطر همین سیاه شده تصویر خروجی )؛ تو تصاویر dst2 تا dst4، تاثیر بیت کم ارزش و پر ارزش رو مشاهده میکنید ( که خب میشه برا پنهان کردن داده ها، داخل بیت های کم ارزش تصاویر استفاده کرد، کسی هم متوجه تغییر تو عکس نمیشه، البته ربطی به این مطلب نداره ولی خب خواستم بگم میشه اینکارو کرد، قبلا تو این مطلب همچین کاری کردم : Steganography )؛ تصویر dst5 هم که دقیقا مثل تصویر ورودی هستش؛ تصویر dst7 تا dst9 هم که اومدم هربار مقدار یه کانال رو دست نزدم و بقیه کانال ها رو 0 کردم، اینطوری تصویر خروجی فقط حاوی 1 کانال میشه ( استخراج کانال! )؛ تصویر dst10 هم که از روی بیکاری نوشتم!؛ یه تصویر ( img3 ) ایجاد کردم که کل پیکسل هاش سیاه ( 0 ) هستش، بعد مرکزشو پیدا کردم و تمام نقاطی که داخل شعاع مدنظر من هستن رو سفید ( 255 ) کردم بعد تابع bitwise_and...؛ تمام کارای که تو dst7 تا dst10 کردم رو توی dst6 بصورت یکجا انجام دادم که مشاهده میکنید.

نتیجه کد بالا :

bitwise_and_src2.png bitwise_and_src1.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
bitwise_and_dst2.jpg bitwise_and_dst1.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
bitwise_and_dst4.jpg bitwise_and_dst3.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
bitwise_and_dst6.jpg bitwise_and_dst5.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
bitwise_and_dst8.jpg bitwise_and_dst7.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
bitwise_and_dst10.jpg bitwise_and_dst9.jpg
آموزش تابع bitwise_and در OpenCV آموزش تابع bitwise_and در OpenCV
2) تابع bitwise_not

2) تابع bitwise_not : محاسبه NOT بیتی عناصر یک آرایه و یا یک scalar.

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

3) تابع bitwise_or

3) تابع bitwise_or : محاسبه OR بیتی عناصر متناظر دو آرایه و یا یک آرایه و یک scalar.

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

4) تابع bitwise_xor

4) تابع bitwise_xor : محاسبه XOR بیتی عناصر متناظر دو آرایه و یا یک آرایه و یک scalar.

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

 

توابع الحاق افقی / عمودی، 2 یا چند ماتریس :

1) تابع hconcat

1) تابع hconcat : الحاق افقی 2 یا چند ماتریس.

تعاریف تابع :

کد نمونه ( برای تعریف 1 ) :

کد نمونه ( برای تعریف 2 ) :

کد نمونه ( برای تعریف 3 ) :

2) تابع vconcat

2) تابع vconcat : الحاق عمودی 2 یا چند ماتریس.

تعاریف تابع :

کد نمونه ( برای تعریف 1 ) :

کد نمونه ( برای تعریف 2 ) :

کد نمونه ( برای تعریف 3 ) :

 

توابع عملیات های ریاضی :

1.1) تابع add

1.1) تابع add : محاسبه مجموع عناصر متناظر دو آرایه و یا یک آرایه و یک scalar.

\( \texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0 \)

تعریف تابع :

توضیح پارامترها :

  • src1 و src2 : آرایه های ورودی با اندازه و نوعی یکسان.
  • dst : آرایه خروجی با اندازه و تعداد کانالی برابر با آرایه های ورودی.

 

کد نمونه : در عکس لوگو OpenCV، زمینه رو سیاه کردم تا تو محاسبات تاثیری نذاره ( مقدار تمام کانال های رنگ سیاه، 0 هستش و سفید 255 )

نتیجه کد بالا :

add_src2.png add_src1.jpg
آموزش تابع add در OpenCV آموزش تابع add در OpenCV
add_dst2.jpg add_dst1.jpg
آموزش تابع add در OpenCV آموزش تابع add در OpenCV
1.2) تابع addWeighted

1.2) تابع addWeighted : محاسبه وزن دار مجموع هر عنصر دو آرایه و یا یک آرایه و یک scalar.

\( \texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} + \texttt{src2} (I)* \texttt{beta} + \texttt{gamma} ) \)

تعریف تابع :

توضیح پارامترها :

  • src1 و src2 : آرایه های ورودی با اندازه و تعداد کانالی یکسان.
  • alpha : وزن / ضریب ( weight ) آرایه اولی ( src1 ).
  • beta : وزن / ضریب ( weight ) آرایه دومی ( src2 ).
  • gamma : مقداری ثابت ( scalar ) که به خروجی اضافه میشود.
  • dst : آرایه خروجی با اندازه و تعداد کانالی برابر با آرایه های ورودی.

 

کد نمونه :

نتیجه کد بالا : تصاویر ورودی، همون تصاویر ورودی تابع add هستند.

addWeighted_dst2.jpg addWeighted_dst1.jpg
آموزش تابع addWeighted در OpenCV آموزش تابع addWeighted در OpenCV
1.3) تابع scaleAdd

1.3) تابع scaleAdd :

\( \texttt{dst} (I)= \texttt{scale} \cdot \texttt{src1} (I) + \texttt{src2} (I) \)

تعریف تابع :

2.1) تابع subtract

2.1) تابع subtract : محاسبه تفریق عناصر متناظر دو آرایه و یا یک آرایه و یک scalar.

\( \texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) - \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0 \)

تعریف تابع :

2.2) تابع absdiff

2.2) تابع absdiff : محاسبه تفاوت مطلق ( absolute difference ) بین عناصر متناظر دو آرایه یا بین یک آرایه و یک scalar.

\( \texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2}(I)|) \)

تعریف تابع :

توضیح پارامترها :

  • src1 و src2 : آرایه های ورودی با اندازه و نوعی یکسان.
  • dst : آرایه خروجی با اندازه و نوعی برابر با آرایه های ورودی.

 

کد نمونه :

نتیجه کد بالا :

absdiff_src2.jpg absdiff_src1.jpg
آموزش تابع absdiff در OpenCV آموزش تابع absdiff در OpenCV
absdiff_dst2.jpg absdiff_dst1.jpg
آموزش تابع absdiff در OpenCV آموزش تابع absdiff در OpenCV
3) تابع divide

3) تابع divide : محاسبه تقسیم عناصر متناظر دو آرایه و یا یک آرایه و یک scalar؛ کانال های آرایه های چند کاناله به طور مستقل پردازش میشوند.

\( \texttt{dst(I) = saturate(src1(I)*scale/src2(I))} \)

\( \texttt{dst(I) = saturate(scale/src2(I))} \)

تعاریف تابع :

4) تابع multiply

4) تابع multiply : محاسبه ضرب عناصر متناظر دو آرایه؛ کانال های آرایه های چند کاناله به طور مستقل پردازش میشوند.

\( \texttt{dst} (I)= \texttt{saturate} ( \texttt{scale} \cdot \texttt{src1} (I) \cdot \texttt{src2} (I)) \)

تعریف تابع :

5) تابع sqrt

5) تابع sqrt : محاسبه جذر ( ریشه 2 ) عناصر یک آرایه.

تعریف تابع :

6) تابع pow

6) تابع pow : محاسبه توان ( n ام ) عناصر یک آرایه.

\( \text{dst} (I) = \begin{cases} \text{src}(I)^{power} & \text{if $power$ is integer} \\ |\text{src}(I)|^{power} & \text{otherwise} \end{cases} \)

تعریف تابع :

7) تابع log

7) تابع log : محاسبه لگاریتم ( در مبنای 10 ) عناصر متناظر یک آرایه.

\( \texttt{dst} (I) = \log (\texttt{src}(I)) \)

تعریف تابع :

8) تابع exp

8) تابع exp : محاسبه e ( عدد نپر ) به توان عناصر متناظر یک آرایه.

\( \texttt{dst} [I] = e^{ src(I) } \)

تعریف تابع :

 

توابع : جدا کردن تمام کانال های یک آرایه؛ ادغام چندین کانال؛ انتقال کانال های دلخواه یک آرایه به آرایه دیگر؛ اضافه کردن یک کانال به آرایه؛ جدا کردن یک کانال از آرایه.

1) تابع split

1) تابع split : جدا کردن کانال های یک آرایه چند کاناله.

تعاریف تابع :

2) تابع merge

2) تابع merge : ادغام کانال های یک آرایه چند کاناله.

تعاریف تابع :

3) تابع mixChannels

3) تابع mixChannels : کپی کردن کانال های مشخص شده از آرایه های ورودی به کانال های مشخص شده در آرایه های خروجی.

تعاریف تابع :

4) تابع extractChannel

4) تابع extractChannel : استخراج یک کانال از آرایه ورودی.

تعریف تابع :

5) تابع insertChannel

5) تابع insertChannel : اضافه کردن یک کانال به آرایه ورودی.

تعریف تابع :

 

توابع ایجاد ارقام تصادفی :

کلاس RNG

کلاس RNG

مولد اعداد تصادفی؛ این کلاس در حال حاضر از توزیع های یکنواخت ( uniform ) و گاوسی / عادی ( Gaussian / Normal ) پشتیبانی میکند؛ ( اگه درست فهمیده باشم ) مولد اعداد تصادفی uniform، از الگوریتم Multiply-With-Carry، معرفی شده توسط George Marsaglia، استفاده میکند؛ مولد اعداد تصادفی Gaussian، از الگوریتم Ziggurat، معرفی شده توسط George Marsaglia و Wai Wan Tsang، استفاده میکند.

 

1) سازنده ها : 2 نوع سازنده برای این کلاس تعریف شده که در تعریف اولی ( بدون پارامتر ورودی )، مقدار state پیشفرض برابر با \( 2^{32} - 1 \) میباشد؛ در تعریف دومی هم که میشه این مقدار رو تنظیم کرد؛ البته اگه مقدار state رو 0 تنظیم کنید، از مقدار پیشفرض استفاده میکنه تا از تولید اعداد تصادفی که همیشه 0 هستند، جلوگیری شود!

توجه : حالا شاید سوال بشه که این state کجا بکار میاد، خب شما اگه یه سری عدد تصادفی ایجاد کنید ( مثلا به کمک تابع fill )، پروژه رو ببندید و دوباره کدتون رو اجرا کنید میبینید که همون اعداد قبلی هستش، با تغیر این state، در دفعات بعدی که پروژه اجرا میشه، اعداد تصادفی جدیدی! ایجاد میشن. ( چیزی که من متوجه شدم )

 

2) تابع fill : آرایه ها را با اعداد تصادفی پر میکند.

توضیح پارامترها :

  • mat : ماتریس 2 بعدی یا N بعدی؛ در حال حاضر ماتریس هایی با بیش از 4 کانال، توسط توابع OpenCV پشتیبانی نمی شوند، از Mat::reshape به عنوان یک راه حل ممکن استفاده کنید.
  • distType : نوع توزیع، RNG::UNIFORM یا RNG::NORMAL.
  • a : اولین پارامتر توزیع ( distribution )؛ در صورت توزیع یکنواخت ( uniform distribution )، این مقدار minimum است ( مقدار تصادفی تولید شده، شامل این مقدار میشود )، در صورت توزیع نرمال ( normal distribution )، این یک مقدار متوسط ( mean ) است.
  • b : دومین پارامتر توزیع؛ در صورت توزیع یکنواخت ( uniform distribution )، این مقدار maximum است ( مقدار تصادفی تولید شده، شامل این مقدار نمیشود )، در مورد توزیع نرمال ( normal distribution )، این یک انحراف معیار ( standard deviation ) است ( مورب ماتریس انحراف استاندارد یا ماتریس انحراف استاندارد کامل ).
  • saturateRange : پرچم پیش اشباع؛ فقط برای توزیع یکنواخت ( uniform distribution )؛ اگر true باشد، تابع، ابتدا a و b را به محدوده مقدار قابل قبول تبدیل می کند ( با توجه به نوع داده mat ) و سپس اعداد تصادفی توزیع شده یکنواخت در محدوده [saturate(a)، saturate(b)) تولید میکند؛ اگر false باشد، تابع، اعداد تصادفی توزیع شده یکنواخت را در محدوده اصلی [a, b) تولید میکند و سپس آنها را اشباع میکند.

کد نمونه 1 : همونطور که در این مثال میبینید، مقدار b رو 2 درنظر گرفتم، نوع mat هم که از نوع طبیعی هستش ( اعدادی که از 0 تا +n بودن رو طبیعی میگفتن فک کنم؛ در کل مهم اینه که اعشاری نیست )، فلذا مقادیر یا 0 هستن یا 1 ( در بالا گفتم که پارامتر b در نتایج قرار نداره؛ به همین خاطر مقدارشو 2 قرار دادم! )

نتیجه کد بالا :

کد نمونه 2 : تو این مثال مقدار نوع داده CV_8UC1 بین 0 تا 255 هستش اما ما در تابع fill گفتیم mat رو با اعدادی بین [-DBL_MAX, DBL_MAX) پر کن، پارامتر saturateRange هم که false هستش، محدوده (0، 255) هم که به طور قابل توجهی کوچکتر از [-DBL_MAX, DBL_MAX) هستش و این یعنی 99.99% اعدادی که تولید میشن، بزرگتر از 255 هستند و این یعنی رخ دادن اشباع!؛ به همین خاطر آرایه ای که تولید میشه، عمدتاً با 0 و 255 پر میشه.

نتیجه کد بالا :

 

3) تابع gaussian : عدد تصادفی بعدی نمونه برداری شده از توزیع گاوسی را برمی گرداند؛ این روش با استفاده از الگوریتم MWC حالت ( state ) را تغییر میدهد و عدد تصادفی بعدی را از توزیع گاوسی N(0,sigma) برمی گرداند، یعنی مقدار میانگین ( mean ) اعداد تصادفی برگشتی صفر و انحراف استاندارد ( standard deviation ) برابر با پارامتر sigma مشخص شده است.

پارامتر sigma : انحراف معیار ( standard deviation ) توزیع ( distribution ).

 

4) تابع uniform : عدد تصادفی یکنواخت توزیع شده را از محدوده [a,b) برمی گرداند.

کد نمونه : 

 

 فرق gaussian با uniform : در مورد فرق gaussian با uniform خلاصه بگم که روش uniform، عدد خروجی بین محدوده مشخص شده هستش، همونطور که از اسمش معلومه، توزیعش، یکنواخت هستش، اما در روش gaussian، توزیع یکنواخت نیست، مقادیر بیشتر نزدیک مقدار حداقل و حداکثر هستند؛ کد زیر رو ببینید، تصاویر خرجی رو در سطح پیکسل ببینید و مقدارشون رو ببینید، و با هم مقایسه کنید ( این توضیح خوبی نیست، هرچند توضیح درست خارج از حوصله هستش، بعدا اگه نیاز شد، این قسمت رو تکمیل میکنم، باید درباره الگوریتم های این دو روش مطالعه کنم، مخصوصا روش گاوسی ) :

نتیجه کد بالا ( زوم 3000% ) :

OpenCV gaussian vs uniform

1 تا 4) توابع theRNG و setRNGSeed و randu و randn

توابع این قسمت برای راحتی کار با کلاس RNG ایجاد شدن!!!

 

1) تابع theRNG : یه شی از کلاس RNG ایجاد میکنه، با مقدار پیشفرض state.

 

2) تابع setRNGSeed : تنظیم وضعیت ( state ) مولد اعداد تصادفی.

 

3) تابع randu : ایجاد یک عدد تصادفی با توزیع یکنواخت ( uniformly-distributed ) یا آرایه ای از اعداد تصادفی.

\( \texttt{low} _c \leq \texttt{dst} (I)_c < \texttt{high} _c \)

کد نمونه :

 

4) تابع randn : پر کردن آرایه با اعداد تصادفی توزیع شده معمولی ( normally distributed ).

کد نمونه :

5) تابع randShuffle

5) تابع randShuffle : عناصر آرایه را به صورت تصادفی با هم مخلوط میکند؛ آرایه 1 بعدی مشخص شده را با انتخاب تصادفی جفت عناصر و تعویض آنها به هم میزند؛ تعداد چنین عملیات مبادله ای \( dst.rows * dst.cols * iterFactor \) خواهد بود.

تعریف تابع :

توضیح پارامترها :

  • dst : آرایه عددی 1 بعدی ورودی/خروجی.
  • iterFactor : ضریب مقیاس که تعداد عملیات مبادله تصادفی را تعیین میکند.
  • rng : مولد اعداد تصادفی اختیاری که برای به هم زدن استفاده میشود؛ اگر صفر باشد به جای آن از theRNG استفاده میشود.

کد نمونه :

 

توابع حل معادلات جبری :

1) تابع solve

1) تابع solve :

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

2) تابع solveCubic

2) تابع solveCubic :

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

3) تابع solvePoly

3) تابع solvePoly :

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

 

توابع تبدیل مختصات Polar به Cartesian و بلعکس ( توابع زیر مختصات نقاط رو تبدیل میکنن و نه عکس؛ برا تبدیل عکس میتونید از تابع warpPolar استفاده کنید ) :

1) تابع polarToCart

1) تابع polarToCart : تبدیل مختصات Polar به Cartesian؛ محاسبه مختصات x و y بردارهای 2 بعدی.

\( \begin{array}{l} \texttt{x} (I) = \texttt{magnitude} (I) \cos ( \texttt{angle} (I)) \\ \texttt{y} (I) = \texttt{magnitude} (I) \sin ( \texttt{angle} (I)) \\ \end{array} \)

تعریف تابع :

توضیح پارامترها :

  • magnitude : آرایه ورودی اعشاری از قدر ( اندازه، بزرگی، وَتَر ) بردارهای 2 بعدی؛ میتواند یک ماتریس خالی باشد، در این صورت، تابع فرض میکند که همه قدرها 1 هستند.
  • angle : آرایه ورودی اعشاری از زوایای بردارهای دو بعدی.
  • x / y : آرایه خروجی مختصات x / y بردارهای 2 بعدی؛ با اندازه و نوعی برابر با angle.
  • angleInDegrees : زوایا بر حسب درجه یا رادیان اندازه گیری شوند؟ ( پیشفرض : رادیان )
2) تابع cartToPolar

2) تابع cartToPolar : تبدیل مختصات Cartesian به Polar؛ محاسبه قدر و زاویه بردارهای 2 بعدی؛ زاویه ها با دقت حدود 0.3 درجه محاسبه میشوند؛ برای نقطه (0,0) زاویه 0 تنظیم شده است.

\( \begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array} \)

تعریف تابع :

توضیح پارامترها :

  • x / y : آرایه ورودی از مختصات x / y؛ این آرایه باید اعشاری با دقت 1 یا 2 رقم باشد.
  • magnitude : آرایه خروجی قدر با اندازه و نوع x.
  • angle : آرایه خروجی زوایا که اندازه و نوع یکسانی با x دارد؛ زاویه ها بر حسب رادیان ( از 0 تا 2*Pi ) یا بر حسب درجه ( 0 تا 360 درجه ) اندازه گیری میشوند.
  • angleInDegrees : زوایا بر حسب درجه یا رادیان اندازه گیری شوند؟ ( پیشفرض : رادیان )

توابع مرتبط با 2 تابع بالا :

1) تابع phase

1) تابع phase : محاسبه زاویه چرخش بردارهای دو بعدی.

\( \texttt{angle} (I) = \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I)) \)

تعریف تابع :

2) تابع magnitude

2) تابع magnitude : محاسبه قدر بردارهای دو بعدی.

\( \texttt{dst} (I) = \sqrt{\texttt{x}(I)^2 + \texttt{y}(I)^2} \)

تعریف تابع :

 

توابع محاسبه مقدارهای ویژه ( eigenvalues ) و بردارهای ویژه ( eigenvectors ) یک ماتریس متقارن / نامتقارن :

1) تابع eigen

1) تابع eigen : محاسبه مقدارهای ویژه ( eigenvalues ) و بردارهای ویژه ( eigenvectors ) یک ماتریس متقارن.

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

2) تابع eigenNonSymmetric

2) تابع eigenNonSymmetric : محاسبه مقدارهای ویژه ( eigenvalues ) و بردارهای ویژه ( eigenvectors ) یک ماتریس نامتقارن.

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

 

توابع مرتبط با Border :

1) تابع borderInterpolate

1) تابع borderInterpolate : مکان منبع یک پیکسل برون یابی ( extrapolated pixel ) را محاسبه میکند؛ این تابع مختصات یک پیکسل اهداکننده ( donor pixel ) متناظر با پیکسل برون یابی ( extrapolated pixel ) مشخص شده را با توجه به حالت مرزی برون یابی ( extrapolation border mode ) محاسبه میکند و برمیگرداند ( خلاصه اش میشه این که مختصات پیکسل های مجازی/حاشیه رو محاسبه میکنه و به کمک مختصات، مقدار پیکسل مجازی/حاشیه محاسبه میشه، چون پیکسل های مجازی/حاشیه به کمک پیکسل های واقعی تصویر مدنظر، محاسبه میشن )؛ برای مثال، اگر از حالت BORDER_WRAP در جهت افقی، و BORDER_REFLECT_101 در جهت عمودی استفاده میکنید و میخواهید مقدار پیکسل مجازی Point(-5، 100) را در یک تصویر اعشاری محاسبه کنید، به صورت زیر باید عمل کنید :

به طور معمول، این تابع به طور مستقیم فراخوانی نمیشود؛ در داخل توابع فیلترها ( این مطلب : آموزش ماژول Image Filtering در OpenCV ) و همچنین در تابع copyMakeBorder ( همین مطلب ) استفاده میشود؛ فلذا عملا کاری با این تابع نداریم! مگه این که بخوایم یه فیلتر جدیدی ایجاد کنیم که...

 

تعریف تابع :

توضیح پارامترها :

  • p : مختصات پیکسل برون یابی ( extrapolated pixel ) در امتداد یکی از محورها، احتمالا \( p < 0 \) یا \( p >= len \)
  • len : طول آرایه در امتداد محور مربوطه.
  • borderType : این پارامتر به کمک نوع شمارشی cv::BorderTypes مقدار دهی میشه ( که در تابع copyMakeBorder تعریفشو قرار دادم، داخل کدهای OpenCV هم میتویند پیداش کنید )
2) تابع copyMakeBorder

2) تابع copyMakeBorder : یک حاشیه در اطراف تصویر ورودی ایجاد میکند.

تعریف تابع :

توضیح پارامترها :

src : تصویر ورودی.

dst : تصویر خروجی؛ نوع dst برابر با نوع src هستش، اما اندازه dst به صورت زیر محاسبه میشه :

top و bottom و left و right : اندازه حاشیه در 4 گوشه تصویر، بر حسب پیکسل.

borderType : نوع حاشیه؛ به کمک نوع شماشی BorderTypes مقدار دهی میشه ( نوع BORDER_TRANSPARENT توسط تابع copyMakeBorder پشتیبانی نمیشه ) :

value : مقدار حاشیه، اگر borderType برابر با BORDER_CONSTANT و یا BORDER_ISOLATED باشد.

 

نوع شمارشی BorderTypes : خب اینجا با مقدار های BORDER_REFLECT101  و BORDER_DEFAULT  که کاری نداریم ( دلیلش هم مشخصه! )؛ میمونه مقدار های BORDER_CONSTANT و BORDER_ISOLATED که یجورایی جفت / 2قلو!!! هستن ( یکیشونو باید انتخاب کنید!؛ توجه کنید که مقدار BORDER_CONSTANT برابر با 0 هستش و یعنی به صورت پیشفرض فعاله! ) مختصرا توضیح بدم : ایندو یکسان هستن، تنها فرقشون اینه که گزینه BORDER_ISOLATED نیم نگاهی به تصویر اصلی داره ( اگه تصویر ما یه ROI از تصویر اصلی باشه ) اما گزینه BORDER_CONSTANT اون نیم نگاه رو نداره! احتملا متوجه نشده باشید، زیاد مهم نی، توضیحات کامل رو در ادامه مطلب گفتم؛ میمونه بقیه مدها! هر کزینه روش محاسبه مجزایی داره که در زیر مشاهده میکنید ( که مثل یه خط کش فرض کنید که روی سطر و ستون و طوری که متوجه شدم، روی قطر ها میزارید و مقدار پیکسل های مجازی یا همون پیکسل های حاشیه رو محاسبه میکیند )؛ معمولا این گزینه ها ( BORDER_CONSTANT یا BORDER_ISOLATED ) رو با گزینه های دیگه AND بیتی میکنند؛ مثلا "BORDER_REPLICATE | BORDER_ISOLATED" یا "BORDER_REPLICATE | BORDER_CONSTANT" ( که معادل "BORDER_REPLICATE" هستش؛ AND بیتی هر داده ای با 0، میشه خودش! )

 

کد نمونه :

نتیجه کد بالا :

خب در این نتیجه بنظر میاد که نتایج BORDER_CONSTANT با BORDER_ISOLATED یکسان هستند؛ در ادامه مثال هایی میزنم تا ببینید که ایندو یکسان نیستن و ببینید که، کجاها نتایجشون فرق میکنه.

 

فرق BORDER_CONSTANT با BORDER_ISOLATED : هنگامی که از مد BORDER_CONSTANT استفاده میکنید و تصویر منبع بخشی ( ROI ) از یک تصویر بزرگتر است، تابع سعی می کند از پیکسل های خارج از ROI برای تشکیل یک حاشیه استفاده کند، اگه پیکسل کم اومد ( مثال زیر رو ببینید ) که از مقدار ثابتی که تعیین کردید استفاده میکنه تابع؛ هنگامی که از مد BORDER_ISOLATED استفاده میکنید، تابع اصلا کاری نداره که تصویری که بهش میدیم ROI هستش، نیستش، میاد و از مقدار ثابتی که براش تعیین کردیم استفاده میکنه.

نتیجه کد بالا :

 

ایجاد حاشیه شفاف به کمک تابع copyMakeBorder : همونطور که پیشتر گفتم، نوع BORDER_TRANSPARENT توسط تابع copyMakeBorder پشتیبانی نمیشه؛ اما اگه میخواید حاشیه TRANSPARENT ایجاد کنید، میتویند از روش زیر استفاده کنید :

یه تصویر رنگی به تابع فوق میدید، فرمت رنگ رو از BGR به BGRA تغییر میدیم ( به کمک کانال ALPHA یا مختصرا A، میتونیم شفافیت پیکسل ها رو تنظیم کنیم )؛ بعد از حاشیه نوع BORDER_CONSTANT استفاده میکنیم تا بتونیم مقدار حاشیه رو خودمون تعیین کنیم، مقدار رو هم هرچی تنظیم کردید، کردید! فقط مقدار آخریش که مربوطه به کانال آلفا هستش رو 0 تنظیم کنید؛ موقعی هم که میخواید تصویر رو ذخیره کنید، حتما با فرمت PNG ذخیره کنید که از BGRA پشتیبانی میکنه ( فرمت JPG از BGRA پشتیبانی نمیکنه و نمیتونید تصویر شفاف با فرمت JPG ایجاد کنید )؛ بعد تصاویر رو که تو فوتوشاپ باز کنید، میتونید به راحتی حاشیه های شفاف ایجاد شده رو مشاهده کنید.

نتیجه کد بالا :

تصویر خروجی تصویر ورودی
opencv create transparent border with copyMakeBorder opencv create transparent border with copyMakeBorder

 

میتونید کارایی که در بالا کردم رو، روی تصاویر انجام بدید، نتیجه جالب باید باشه!

 

مطالعه بیشتر : 

 

?????????????????????

1) تابع sort

1) تابع sort :

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

2) تابع sortIdx

2) تابع sortIdx :

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

 

توابع مرتبط با ماتریس ها :

1) تابع determinant

1) تابع determinant : محاسبه دترمینان ( determinant ) یک ماتریس مربعی اعشاری.

تعریف تابع :

توضیح پارامترها : ماتریس ورودی باید نوعش CV_32FC1 و یا CV_64FC1 و اندازش هم مربعی باشه.

کد نمونه :

2) تابع invert

2) تابع invert : معکوس ( inverse ) یا شبه معکوس ( pseudo-inverse matrix ) یک ماتریس را پیدا میکند.

تعریف تابع :

توضیح پارامترها : پارامتر flags به کمک Enum زیر مقدار دهی میشه :

3.1) تابع transpose

3.1) تابع transpose : محاسبه ترانهاده ( Transpose ) یک ماتریس.

تعریف تابع :

کد نمونه :

نتیجه کد بالا :

3.2) تابع transposeND

3.2) تابع transposeND : محاسبه ترانهاده ( Transpose ) یک ماتریس N بعدی.

تعریف تابع :

3.3) تابع mulTransposed

3.3) تابع mulTransposed : -

\( \texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} )^T ( \texttt{src} - \texttt{delta} ) \)

اگر aTa = true :

\( \texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} ) ( \texttt{src} - \texttt{delta} )^T \)

تعریف تابع :

4) تابع trace

4) تابع trace : محاسبه اثر ماتریس ( trace of matrix )؛ این تابع، مجموع عناصر قطری ماتریس mtx را برمی گرداند.

\( \mathrm{tr} ( \texttt{mtx} ) = \sum _i \texttt{mtx} (i,i) \)

تعریف تابع :

کد نمونه :

نتیجه کد بالا :

5) تابع sum

5) تابع sum : مجموع عناصر آرایه به طور مستقل برای هر کانال محاسبه میکند.

تعریف تابع :

کد نمونه :

نتیجه کد بالا :

6) تابع rotate

6) تابع rotate : یک آرایه دو بعدی را در مضربی از 90 درجه می چرخاند.

 

تعریف تابع :

توضیح پارامترها : پارامتر rotateCode به کمک enum زیر مقدار دهی میشود :

 

کد نمونه :

نتیجه کد بالا :

7.1) تابع countNonZero

7.1) تابع countNonZero : شمارش تعداد عناصر غیر صفر آرایه ورودی.

تعریف تابع :

کد نمونه :

7.2) تابع findNonZero

7.2) تابع findNonZero : لیست مکان پیکسل های غیر صفر را برمی گرداند.

تعریف تابع :

کد نمونه :

نتیجه کد بالا :

8) تابع flip

8) تابع flip : یک آرایه دو بعدی را حول محورهای عمودی، افقی یا هر دو می چرخاند.

تعریف تابع :

توضیح پارامترها : چرخش آرایه حول محور X ( flipCode = 0 )؛ چرخش آرایه حول محور Y ( flipCode > 0 )؛ چرخش آرایه حول محورهای X و Y ( flipCode < 0 ).

کد نمونه :

نتیجه کد بالا :

9) تابع setIdentity

9) تابع setIdentity : یک ماتریس همانی ( Identity Matrix ) مقیاس شده را راه اندازی ( مقدار دهی اولیه ) میکنه؛ تو ماتریس همانی، عناصر روی قطر اصلی ماتریس، 1 و بقیه عناصر 0 هستند ولی این تابع میگه ماتریس همانی مقیاس شده فلذا دیگه اون عناصر 1 نیستند و هرچی در پارامتر s در تابع setIdentity تنظیم کنید، خواهند بود.

\( \text{mtx} (i,j) = \begin{cases} \text{value} & \text{if $i$=$j$} \\ 0 & \text{otherwise} \end{cases} \)

تعریف تابع :

کد نمونه :

نتیجه کد بالا :

10.1) تابع reduce

10.1) تابع reduce : یک ماتریس را به بردار کاهش میدهد؛ تابع reduce با در نظر گرفتن سطرها/ستون های ماتریس به عنوان مجموعه ای از بردارهای 1 بعدی و انجام عملیات مشخص شده روی بردارها تا زمانی که یک سطر/ستون واحد به دست آید، ماتریس را به یک بردار کاهش میدهد؛ به عنوان مثال، تابع را میتوان برای محاسبه پیش بینی های افقی و عمودی یک تصویر شطرنجی استفاده کرد؛ در مورد REDUCE_MAX و REDUCE_MIN، نوع dst باید همانند نوع src باشد؛ در مورد REDUCE_SUM و REDUCE_AVG، نوع dst ممکن است عمق بیتی ( bit-depth ) بزرگتری برای حفظ دقت داشته باشد؛ آرایه های چند کانالی نیز در این دو حالت کاهش پشتیبانی میشوند.

 

تعریف تابع :

توضیح پارامترها :

  • src : ماتریس 2 بعدی.
  • dst : بردار خروجی؛ با اندازه ای برابر با ( مقدار تعیین شده در پارامتر ) dim و نوعی برابر با ( مقدار تعیین شده در پارامتر ) dtype.
  • dim : شاخص ابعادی که در طول آن ماتریس کاهش مییابد؛ 0 به این معنی است که ماتریس به یک ردیف کاهش مییابد؛ 1 به این معنی است که ماتریس به یک ستون کاهش مییابد.
  • rtype : عملیات کاهش که به کمک enum زیر مقداردهی میشود.
  • dtype : زمانی که مقدارش منفی باشه، نوع dst برابر با src خواهد بود، در غیر اینصورت مقداری که در این پارامتر تنظیم میکنید، نوع dst رو تعیین میکنه.
 

کد نمونه :

نتیجه کد بالا :

توجه : در مسیر زیر هم کد نمونه مشابهی نیز وجود داره :

[opencv-4.6.0]/samples/cpp/tutorial_code/snippets/core_reduce.cpp

10.2) تابع reduceArgMax

10.2) تابع reduceArgMax : -

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

10.3) تابع reduceArgMin

10.3) تابع reduceArgMin : -

تعریف تابع :

توضیح پارامترها :

کد نمونه :

نتیجه کد بالا :

11) تابع inRange

11) تابع inRange : این تابع بررسی میکنه که عناصر آرایه ورودی، بین عناصر دو آرایه ( یا مقدار ثابت Scalar ) lowerb و upperb هستند یا نه؛ اگر قرار داشتند که مقدار اون عنصر در آرایه خروجی 255 میشه وگرنه 0 میشه.

برای هر عنصر از یک آرایه ورودی تک کاناله :

\( \text{dst} (I)= \text{lowerb} (I)_0 \leq \text{src} (I)_0 \leq \text{upperb} (I)_0 \)

برای آرایه های دو کاناله : نماد \( \land \) به معنی AND هستش.

\( \text{dst} (I)= \text{lowerb} (I)_0 \leq \text{src} (I)_0 \leq \text{upperb} (I)_0 \land \text{lowerb} (I)_1 \leq \text{src} (I)_1 \leq \text{upperb} (I)_1 \)

و...

 

تعریف تابع :

توضیح پارامترها :

  • src : آرایه ورودی.
  • lowerb : آرایه حاوی مرز پایین یا یک مقدار ثابت Scalar.
  • upperb : آرایه حاوی مرز بالا یا یک مقدار ثابت Scalar.
  • dst : آرایه خروجی؛ با اندازه ای برابر با src و نوع CV_8U.

 

کد نمونه :

نتیجه کد بالا :

 

مطلب مرتبط با این تابع : Thresholding Operations using inRange

12) تابع patchNaNs

12) تابع patchNaNs : تبدیل مقادیر NAN به مقدار مدنظر.

تعریف تابع :

توضیح پارامترها : ماتریس ورودی / خروجی a باید از نوع CV_32F باشد.

 

کد نمونه :

نتیجه کد بالا :

13.1) تابع mean

13.1) تابع mean : میانگین ( average / mean ) عناصر یک آرایه را محاسبه میکند؛ محاسبات برای هر کانال، به صورت مستقل انجام میگیرد.

تعریف تابع :

کد نمونه :

 

محاسبه میانگین رنگ در OpenCV : برای اینکار از تابع mean استفاده میکنیم و محدوده ای که میخوایم میانگین رنگشو محاسبه کنیم، ماسک شو ایجاد میکنیم و به تابع mean میدیم؛ در کد زیر میانگین رنگ هر محدوده 50x50 پیکسل عکس رو پیدا کردم و جایگزین پیکسل ها کردم :

نتیجه کد بالا :

opencv average color
تصویر ورودی
opencv average color
تصویر خروجی
13.2) تابع meanStdDev

13.2) تابع meanStdDev : میانگین ( average / mean ) و انحراف معیار ( standard deviation ) عناصر آرایه را محاسبه میکند؛ محاسبات برای هر کانال، به صورت مستقل انجام میگیرد.

تعریف تابع :

کد نمونه :

14) تابع compare

14) تابع compare : مقایسه عناصر دو آرایه یا یک آرایه و مقدار اسکالر را انجام میدهد؛ هنگامی که نتیجه مقایسه درست باشد، عنصر مربوطه در آرایه خروجی روی 255 تنظیم میشود، در غیر اینصورت 0 تنظیم میشود؛ مثلا مقایسه 2 آرایه رو روی مد CMP_EQ تنظیم کردید، حالا هر جایی که عناصر دو آرایه با هم برابر باشن، اون خونه در آرایه خروجی، مقدارش 255 میشه و اگه برابر نبودن که 0 میشه و...

 

تعریف تابع :

توضیح پارامترها : پارامتر cmpop به کمک enum زیر مقدار دهی میشه.

 

کد نمونه :

نتیجه کد بالا :

15) تابع calcCovarMatrix

15) تابع calcCovarMatrix : ماتریس کوواریانس ( Covariance Matrix ) مجموعه ای از بردارها را محاسبه میکند؛ این تابع علاوه بر محاسبه ماتریس کوواریانس، به صورت اختیاری، میانگین بردار ( mean vector ) مجموعه بردارهای ورودی را نیز محاسبه میکند.

 

تعریف تابع :

توضیح پارامترها : پارامتر CovarFlags به کمک enum زیر مقدار دهی میشه.

 

کد نمونه :

نتیجه کد بالا :

16) تابع LUT

16) تابع LUT : تبدیل جدول جستجو ( look-up table transform ) را برای آرایه ورودی انجام میدهد؛ این تابع، آرایه خروجی را با مقادیر جدول جستجو پر میکند.

\( \texttt{dst} (I) \leftarrow \texttt{lut(src(I) + d)} \)

\( d = \begin{cases} 0 & \text{if src has depth CV_8U} \\ 128 & \text{if src has depth CV_8S} \end{cases} \)

تعریف تابع :

 

کد نمونه : 3 نوع مثال زدم برا این تابع، فک کنم کافی باشه برا فهمیدن کار این تابع.

نتیجه کد بالا :

فایل خام تصویر ورودی :

opencv LUT function

تصاویر خروجی :

opencv LUT function

 

مطالعه بیشتر : 

17.1) تابع min

17.1) تابع min : محاسبه minimum عناصر دو آرایه یا یک آرایه و یک اسکالر.

\( \texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I)) \)

\( \texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{value} ) \)

تعریف توابع :

17.2) تابع max

17.2) تابع max : محاسبه maximum عناصر دو آرایه یا یک آرایه و یک اسکالر.

\( \texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I)) \)

\( \texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{value} ) \)

تعریف توابع :

18.1) تابع perspectiveTransform

18.1) تابع perspectiveTransform : اعمال تبدیل perspective به آرایه ورودی؛ در مطلب ( آموزش ماژول Geometric Image Transformations در OpenCV )، با تابع warpPerspective آشنا شدیم، که عملکردش با تابع perspectiveTransform یکسان بنظر میرسه؛ فرقشون در اینه که warpPerspective برای تصاویر عمل میکرد و perspectiveTransform برای بردارها ( به نقل از : What is the difference between warpPerspective and perspectiveTransform )

تعریف تابع :

توضیح پارامترها :

  • src : آرایه ورودی 2 یا 3 کاناله اعشاری؛ هر عنصر یک بردار 2_بعدی / 3_بعدی است که باید تبدیل شود.
  • dst : آرایه خروجی؛ با اندازه و نوعی برابر با src.
  • m : ماتریس تبدیل اعشاری 3x3 یا 4x4.

 

کد نمونه : در مسیرهای زیر، مثالهایی از این تابع رو مشاهده میکنید :

[opencv]/samples/cpp/asift.cpp

[opencv]/samples/cpp/tutorial_code/features2D/AKAZE_tracking/planar_tracking.cpp

[opencv]/samples/cpp/tutorial_code/features2D/feature_homography/SURF_FLANN_matching_homography_Demo.cpp

18.2) تابع transform

18.2) تابع transform  : -

تعریف تابع :

19) تابع repeat

19) تابع repeat : آرایه خروجی را با کپی های مکرر از آرایه ورودی، در امتداد هر یک از دو محور، پر میکند.

 

تعریف توابع :

توضیح پارامترها :

  • src : آرایه ورودی.
  • dst : آرایه خروجی؛ با نوعی برابر با src.
  • nx : تعداد تکرار در امتداد محور افقی ( X ).
  • ny : تعداد تکرار در امتداد محور عمودی( Y ).

 

کد نمونه :

نتیجه کد بالا :