Pnmconvol User Manual(0) Pnmconvol User Manual(0)

pnmconvol - کانولوشن عمومی MxN بر روی یک تصویر Netpbm

pnmconvol { -matrix=convolution_matrix | -matrixfile=filename[,filename[, ...]] } [-normalize] [-bias=n]

[netpbmfile]

pnmconvol convolution_matrix_file [-normalize] [-nooffset] [netpbmfile]

حداقل اختصار یکتای هر گزینه پذیرفته می‌شود. می‌توانید برای مشخص کردن گزینه‌ها به جای یک خط تیره از دو خط تیره استفاده کنید. همچنین می‌توانید به جای علامت مساوی، از فاصله برای جدا کردن نام گزینه از مقدار آن استفاده نمایید.

این برنامه بخشی از Netpbm(1) است.

دستور pnmconvol یک تصویر Netpbm را به عنوان ورودی می‌خواند، عملیات کانولوشن را با یک ماتریس کانولوشن مشخص روی آن اعمال می‌کند، و یک تصویر Netpbm را در خروجی می‌نویسد.

یک کاربرد معمول کانولوشن، تار کردن (blurring) تصویر است. به مثال‌های موجود در راهنمای pamgauss(1) مراجعه کنید.

کانولوشن به معنای جایگزین کردن هر پیکسل با میانگین وزنی پیکسل‌های مجاور آن است. وزن‌ها و ناحیه میانگین‌گیری توسط ماتریس کانولوشن (که گاهی هسته یا کرネル کانولوشن نامیده می‌شود) تعیین می‌شوند، که می‌توانید آن را به یکی از چند روش موجود ارائه دهید. بخش ماتریس کانولوشن (Convolution Matrix) را ببینید.

در لبه‌های تصویر کانولوشن‌شده، جایی که ماتریس کانولوشن از مرز تصویر فراتر می‌رود، pnmconvol صرفاً پیکسل‌های ورودی را مستقیماً به خروجی کپی می‌کند. در اغلب موارد بهتر است پیکسل‌های نزدیک لبه با فرض وجود یک رنگ خالی یا پس‌زمینه فراتر از لبه پردازش شوند. برای این کار، از pnmpad استفاده کنید تا حاشیه‌ای در اطراف تصویر ایجاد کند که اندازه آن در هر بعد، نصف اندازه ماتریس کانولوشن (بدون احتساب عنصر مرکزی) باشد. (به عنوان مثال، اگر ماتریس کانولوشن شما دارای عرض ۵ و ارتفاع ۳ است، از pnmpad -left=2 -right=2 -top=1 -bottom=1 استفاده کنید). تصویر بزرگ‌شده را به pnmconvol بدهید، سپس با استفاده از pamcut لبه‌های اضافی خروجی کانولوشن را برش دهید تا ابعاد تصویر به اندازه اصلی بازگردد (برای مثال: pamcut -left=2 -right=-2 -top=1 -bottom=-1).

محاسبات کانولوشن ممکن است به مقداری منجر شود که خارج از محدوده قابل نمایش در خروجی باشد. هنگامی که این اتفاق می‌افتد، pnmconvol مقدار خروجی را برش می‌دهد (clip می‌کند)، که این امر به معنای حفظ نشدن روشنایی خواهد بود.

برای جلوگیری از برش خوردن مقادیر (clipping)، ممکن است بخواهید مقادیر ورودی خود را مقیاس‌بندی کنید. به عنوان مثال، اگر ماتریس کانولوشن شما ممکن است مقدار خروجی‌ای تولید کند که تا دو برابر حداکثر مقدار در ورودی باشد، مطمئن شوید که maxval ورودی (که هم‌زمان maxval خروجی نیز خواهد بود) حداقل دو برابر حداکثر مقدار واقعی در ورودی باشد.

برش مقادیر منفی نیازمند توجه ویژه‌ای است. اگر ماتریس کانولوشن شامل اعداد منفی باشد، این احتمال وجود دارد که pnmconvol مقدار یک پیکسل خروجی را عددی منفی محاسبه کند، که در این حالت pnmconvol طبیعتاً آن را به صفر برش می‌دهد، زیرا فرمت‌های Netpbm قادر به نمایش اعداد منفی نیستند.

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

  • مستقیماً با گزینه -matrix.
  • در یک فایل (یا مجموعه‌ای از آن‌ها) که با گزینه -matrixfile مشخص می‌شود، و محتوای آن مشابه با مقدار گزینه -matrix است.
  • با یک فایل ویژه PNM.

روش استفاده از فایل PNM سخت‌ترین راه است و فقط به این دلیل وجود دارد که تا پیش از Netpbm 10.49 (دسامبر ۲۰۰۹)، این تنها روش ممکن بود.

فایل ماتریس کانولوشن معمولی نسبت به مقدار گزینه -matrix خوانایی بهتری دارد و خط فرمان شما را خلوت‌تر می‌کند، اما نیازمند مدیریت یک فایل جداگانه است. با استفاده از فایل، می‌توانید ماتریس‌های کانولوشن مجزایی برای هر یک از مؤلفه‌های رنگی داشته باشید، کاری که با گزینه -matrix امکان‌پذیر نیست.

در هر صورت، ماتریس کانولوشنی که pnmconvol استفاده می‌کند ماتریسی از اعداد حقیقی است. این اعداد می‌توانند صحیح یا کسری، مثبت، منفی یا صفر باشند.

ماتریس کانولوشن همیشه دارای عرض و ارتفاع فرد است، تا یک عنصر مرکزی وجود داشته باشد. pnmconvol به صورت تمثیلی آن عنصر مرکزی را روی پیکسلی از تصویر ورودی قرار می‌دهد و به آن پیکسل و همسایگانش بر اساس ماتریس کانولوشن وزن می‌دهد تا پیکسل موجود در همان موقعیت از تصویر خروجی را تولید کند.

برای یک کانولوشن عادی، که در آن مقداری به ارزش کلی تصویر اضافه یا کم نمی‌کنید بلکه صرفاً آن را بازتوزیع می‌کنید، باید مطمئن شوید که مجموع تمام اعداد در ماتریس برابر با ۱ است. اگر چنین نباشد، pnmconvol هشدار می‌دهد.

عناصر ماتریس در واقع چندتایی‌ها (tuples) هستند، یکی برای هر نمونه در ورودی (یعنی اگر ورودی یک تصویر RGB باشد، هر عنصر ماتریس کانولوشن یک وزن برای قرمز، یکی برای سبز و یکی برای آبی دارد).

مستقیماً در خط فرمان (Directly On the Command Line)

در اینجا مثال‌هایی از گزینه -matrix آورده شده است:


    -matrix=0,.2,0;.2,.2,.2;0,.2,0

    -matrix=-1,3,-1

مقدار شامل هر سطر از ماتریس از بالا به پایین است که با نقطه-ویرگول (;) از یکدیگر جدا شده‌اند. هر سطر شامل عناصر آن سطر از چپ به راست است که با ویرگول (,) از هم جدا شده‌اند. طبیعتاً تعداد عناصر در هر سطر باید برابر باشد. هر عنصر یک عدد ممیز شناور ده‌دهی است و وزنی را مشخص می‌کند که باید به هر مؤلفه از پیکسلی که متناظر با آن موقعیت ماتریس است، اختصاص داده شود.

توجه داشته باشید هنگامی که این گزینه را در پوسته وارد می‌کنید، نقطه-ویرگول (";") معمولاً برای پوسته معنای خاصی دارد، بنابراین از علامت‌های نقل‌قول استفاده کنید.

با این روش راهی برای اختصاص وزن‌های متفاوت به مؤلفه‌های مختلف یک پیکسل وجود ندارد.

گزینه -normalize اغلب همراه با -matrix بسیار کاربردی است زیرا به شما امکان می‌دهد بدون نیاز به انجام محاسبات ریاضی جهت اطمینان از بدون انحراف (بایاس) بودن ماتریس، دستور را به سرعت اجرا کنید. توجه داشته باشید که اگر از گزینه -normalize استفاده کنید، وزن‌های موجود در ماتریس دقیقاً همان اعدادی نخواهند بود که در گزینه -matrix مشخص کرده‌اید.

فایل ماتریس معمولی (Regular Matrix File)

نام فایل ماتریس را با گزینه -matrixfile مشخص کنید؛ یا فهرستی از آن‌ها را، یکی برای هر صفحه (plane) تصویر، تعیین نمایید.

مثال‌ها:


    -matrixfile=mymatrix


    -matrixfile=myred,mygreen,myblue

هر فایل به ترتیب به یک صفحه از تصویر (مانند قرمز، سبز، یا آبی) اعمال می‌شود. ماتریس درون هر فایل باید ابعاد یکسانی داشته باشد. اگر تصویر ورودی صفحات بیشتری نسبت به تعداد فایل‌های مشخص‌شده داشته باشد، نخستین فایل به صفحات اضافی نیز اعمال خواهد شد.

دستور pnmconvol فایل را به صورت متنی تفسیر می‌کند، که خطوط آن با نویسه‌های خط جدید یونیکس (line feeds) جدا شده‌اند.

هر خط از فایل نشان‌دهنده یک سطر از ماتریس، به ترتیب از بالا به پایین است..PP برای هر سطر، فایل شامل یک عدد اعشاری ممیز شناور برای هر عنصر در سطر، از چپ به راست، و جداشده با فاصله (space) است. این فقط یک فاصله خالی دلخواه نیست -- بلکه دقیقاً یک فاصله است. دو فاصله متوالی در یک سطر به این معنی است که شما یک رشته تهی را برای یک عنصر مشخص کرده‌اید (که نامعتبر است). اگر می‌خواهید ماتریس خود را از نظر بصری تراز کنید، برای این کار از صفرهای ابتدایی و انتهایی در اعداد ممیز شناور استفاده کنید.

هیچ روشی برای قرار دادن یادداشت (کامنت) در فایل وجود ندارد. هیچ امضا یا فرادادهٔ دیگری نیز در فایل وجود ندارد.

توجه داشته باشید که اگر از گزینهٔ -normalize استفاده کنید، وزن‌های موجود در ماتریس در عمل دقیقاً همان مقادیری نخواهند بود که در فایل آمده است.

فایل PNM (PNM File)

پیش از Netpbm نسخهٔ 10.49 (دسامبر 2009)، این تنها راه برای تعیین یک ماتریس کانولوشن بود. pnmconvol از این روش در تلاشی برای بهره‌برداری از قابلیت‌های عمومی پردازش ماتریس Netpbm استفاده می‌کرد، اما از آنجا که قالب‌های Netpbm مستقیماً ماتریس‌هایی با انواع اعدادی که در یک ماتریس کانولوشن نیاز دارید را مجاز نمی‌دانند، استفاده از آن بسیار دشوار و دست‌وپاگیر است. در واقع، به‌هیچ‌وجه راهی برای تعیین برخی از ماتریس‌های کانولوشن با یک تصویر استاندارد Netpbm وجود ندارد، بنابراین برای اینکه این سازوکار کار کند، pnmconvol مجبور است این الزام فایل Netpbm را که بر اساس آن مقادیر نمونه‌ها نباید بیشتر از maxval تصویر باشند، نادیده بگیرد. به این معنی که این فایل حتی یک فایل واقعی PNM نیز به حساب نمی‌آید.

روشی که این شیوه از ارائهٔ ماتریس کانولوشن را انتخاب می‌کنید این است که گزینه‌های -matrix یا -matrixfile را مشخص نکنید. وقتی این کار را انجام می‌دهید، باید نام فایل PNM (یا فایل PAM معادل PNM) را به عنوان یک آرگومان غیرگزینه‌ای (پیش از نام فایل ورودی اختیاری) تعیین کنید.

دو روش وجود دارد که pnmconvol پیکسل‌های تصویر ماتریس کانولوشن PNM را به عنوان وزن تفسیر می‌کند: با آفست (offset) و بدون آفست.

روش ساده‌تر از این دو، حالت بدون آفست است. این همان حالتی است که گزینهٔ -nooffset را مشخص می‌کنید. در این حالت، pnmconvol به سادگی مقادیر نمونه را در تصویر PNM با تقسیم بر maxval نرمال‌سازی می‌کند.

به عنوان مثال، در اینجا یک نمونه فایل کانولوشن آورده شده است که باعث می‌شود یک پیکسل خروجی میانگین ساده‌ای از پیکسل ورودی متناظرش و ۸ همسایهٔ آن باشد، که در نتیجه به یک تصویر هموارشده (smooth) منجر می‌شود:

P2
3 3
18
2 2 2
2 2 2
2 2 2

(توجه داشته باشید که متن بالا یک فایل واقعی PGM است -- می‌توانید آن را برش داده و جای‌گذاری کنید. اگر با ساختار قالب سادهٔ PGM آشنایی ندارید، the PGM format specification(1) را ببینید).

ابزار pnmconvol هر یک از مقادیر نمونه (2) را بر maxval (18) تقسیم می‌کند، بنابراین وزنی که به هر یک از 9 پیکسل ورودی اختصاص می‌یابد 1/9 است، که دقیقاً همان مقداری است که برای ثابت نگه داشتن روشنایی کلی تصویر به آن نیاز دارید. pnmconvol یک پیکسل خروجی را با ضرب کردن مقادیر هر یک از 9 پیکسل در 1/9 و جمع کردن آن‌ها ایجاد می‌کند.

توجه داشته باشید که با maxval برابر با 18، محدودهٔ مقادیر ممکن 0 تا 18 است. پس از مقیاس‌بندی، محدوده 0 تا 1 خواهد بود.

برای یک کانولوشن معمولی، که در آن نه مقداری از مقدار کل تصویر کم می‌کنید و نه به آن می‌افزایید، بلکه صرفاً آن را جابه‌جا و بازتوزیع می‌کنید، باید مطمئن شوید که مجموع تمام مقادیر مقیاس‌بندی‌شده در (هر صفحه از) PNM کانولوشن شما برابر با 1 باشد، به این معنی که مجموع تمام مقادیر واقعی نمونه‌ها برابر با maxval شود. همچنین، می‌توانید از گزینهٔ -normalize استفاده کنید تا مقادیر مقیاس‌بندی‌شده را بیشتر مقیاس‌بندی کند تا مجموع همهٔ آن‌ها به طور خودکار برابر با 1 شود.

هنگامی که گزینهٔ -nooffset را مشخص نمی‌کنید، pnmconvol یک آفست اعمال می‌کند که هدف آن این است که به شما امکان دهد وزن‌های منفی را تعیین کنید، حتی با وجود اینکه مقادیر نمونهٔ PNM هرگز منفی نیستند. در این حالت، pnmconvol نیمی از مقدار maxval را از هر نمونه کم می‌کند و سپس با تقسیم بر نیمی از maxval نرمال‌سازی را انجام می‌دهد. بنابراین برای دستیابی به همان نتیجه‌ای که در بالا با -nooffset به دست آوردیم، تصویر ماتریس کانولوشن PNM باید به این شکل باشد:

P2
3 3
18
10 10 10
10 10 10
10 10 10

برای اینکه ببینید این فرایند چگونه کار می‌کند، آفست یادشده را اعمال کنید: 10 - 18/2 مقدار 1 را به دست می‌دهد. مرحلهٔ نرمال‌سازی مقدار را بر 18/2 = 9 تقسیم می‌کند، که حاصل آن 1/9 می‌شود - دقیقاً همان چیزی که نیاز دارید. ماتریس معادل برای هموارسازی 5x5 دارای maxval برابر با 50 بوده و با 26 پر خواهد شد.

توجه داشته باشید که با maxval برابر با 18، محدودهٔ مقادیر ممکن 0 تا 18 است. پس از اعمال آفست، این محدوده -9 تا 9 خواهد بود، و پس از نرمال‌سازی، محدوده به -1 تا 1 تبدیل می‌شود.

فایل کانولوشن معمولاً یک PGM خواهد بود، به طوری که همان کانولوشن برای هر یک از مؤلفه‌های رنگی اعمال شود. با این حال، اگر می‌خواهید از یک PPM استفاده کنید و کانولوشن‌های متفاوتی را برای رنگ‌های مختلف انجام دهید، قطعاً می‌توانید این کار را انجام دهید.

ابزار pnmconvol تنها کانولوشن حسابی و ترکیب خطی را انجام می‌دهد. اشکال دیگری از کانولوشن وجود دارند که به ویژه در پردازش تصویر کاربرد دارند.

دستور pgmmedian فیلتر میانه (median filtering) را انجام می‌دهد، که شکلی از کانولوشن است که در آن مقدار پیکسل خروجی، به جای اینکه ترکیب خطی پیکسل‌های موجود در پنجره باشد، میانهٔ زیرمجموعهٔ خاصی از آن‌ها است.

دستور pgmmorphconv عملیات گشادسازی (dilation) و فرسایش (erosion) را انجام می‌دهد، که مشابه فیلتر میانه است اما مقدار خروجی حداقل یا حداکثر مقادیر موجود در پنجره خواهد بود.

علاوه بر گزینه‌های مشترک در تمامی برنامه‌های مبتنی بر libnetpbm (به‌ویژه -quiet، به گزینه‌های معمول (Common Options) مراجعه کنید)، pnmconvol گزینه‌های خط فرمان زیر را می‌شناسد:

مقدار ماتریس کانولوشن. به ماتریس کانولوشن مراجعه کنید.

نمی‌توانید هر دوی این گزینه و -matrixfile را هم‌زمان مشخص کنید.

این گزینه در Netpbm 10.49 (دسامبر ۲۰۰۹) اضافه شد. پیش از آن، برای ماتریس کانولوشن از یک فایل PNM استفاده می‌شد.

این گزینه مشخص می‌کند که ماتریس کانولوشن را در یک فایل ارائه می‌دهید و نام آن فایل را مشخص می‌سازد. به ماتریس کانولوشن مراجعه کنید.

نمی‌توانید هر دوی این گزینه و -matrix را هم‌زمان مشخص کنید.

این گزینه در Netpbm 10.49 (دسامبر ۲۰۰۹) اضافه شد. پیش از آن، برای ماتریس کانولوشن از یک فایل PNM استفاده می‌شد.

این گزینه وزن‌های موجود در ماتریس کانولوشن را به‌گونه‌ای تنظیم می‌کند که مجموع همهٔ آن‌ها برابر با یک شود. معمولاً تمایل بر این است که مجموع آن‌ها برابر با یک باشد تا نتیجهٔ کانولوشن روشنایی کلی مشابهی با تصویر ورودی داشته باشد. با -normalize، pnmconvol تمام وزن‌ها را با ضریبی یکسان مقیاس‌بندی می‌کند تا مجموع آن‌ها برابر با یک گردد. این کار را برای هر صفحه رنگی انجام می‌دهد.

این قابلیت بسیار سودمند است زیرا می‌توانید اعدادی را درون ماتریس وارد کنید که صرفاً رابطهٔ نسبی درستی با یکدیگر دارند و انجام عمل نرمال‌سازی آن‌ها را به pnmconvol بسپارید. همچنین می‌توانید با افزایش یا کاهش برخی وزن‌ها ماتریس را تنظیم کنید، بدون اینکه نیاز باشد برای حفظ نرمال بودن همهٔ وزن‌های دیگر را تغییر دهید. علاوه بر این، می‌توانید به راحتی از اعداد صحیح استفاده کنید.

مثال:


    $ pnmconvol myimage.ppm -normalize -matrix=1,1,1;1,1,1;1,1,1

این دستور مسلماً یک میانگین‌گیر پایهٔ 3x3 است، بدون اینکه نیاز باشد برای هر وزن مقدار 1/9 (.1111111) را تعیین کنید.

این گزینه در Netpbm 10.50 (مارس ۲۰۱۰) اضافه شد. اما پیش از Netpbm 10.79 (ژوئن ۲۰۱۷)، زمانی که ماتریس کانولوشن را از طریق فایل pseudo-PNM تعیین می‌کردید هیچ اثری نداشت.

مقداری را مشخص می‌کند که به مقدار کانولوشن هر نمونه (sample) اضافه می‌شود.

هدف از این افزایش، معمولاً مدیریت نتایج منفی کانولوشن است. از آنجا که ماتریس کانولوشن می‌تواند شامل اعداد منفی باشد، مقدار کانولوشن برای یک پیکسل ممکن است منفی شود. اما قالب‌های Netpbm نمی‌توانند شامل مقادیر نمونهٔ منفی باشند، بنابراین بدون هیچ بایاسی (bias)، این نمونه‌ها روی صفر برش می‌خورند (clipped). بایاس به تصویر خروجی اجازه می‌دهد اطلاعات را حفظ کند، و برنامه‌ای که خروجی را پردازش می‌کند با آگاهی از مقدار بایاس می‌تواند مقادیر واقعی کانولوشن را بازسازی نماید.

برای مثال، با bias=100، نمونه‌ای که مقدار کانولوشن آن -5 باشد در خروجی به‌صورت 95 ظاهر می‌شود، در حالی که نمونه‌ای با مقدار کانولوشن 5 در خروجی به‌صورت 105 نمایش می‌یابد.

مقدار معمول برای بایاس، نصف مقدار maxval است که بازهٔ برابری را در هر دو سمت صفر فراهم می‌کند.

اگر مقدار نمونه پس از اعمال بایاس همچنان کمتر از صفر باشد، pnmconvol آن را روی صفر برش می‌دهد (clip). اگر از maxval تصویر خروجی فراتر رود، آن را روی maxval برش می‌دهد.

پیش‌فرض صفر است.

این گزینه در Netpbm 10.68 (سپتامبر ۲۰۱۴) اضافه شد.

این گزینه بخشی از روش منسوخ‌شدهٔ تصویر PNM برای تعیین ماتریس کانولوشن است. به ماتریس کانولوشن مراجعه کنید.

گزینهٔ -nooffset در Netpbm 10.23 (ژوئیه ۲۰۰۴) اضافه شد که تعیین ماتریس کانولوشن را به‌میزان قابل‌توجهی ساده‌تر کرد، اما همچنان دشوار بود. در Netpbm 10.49 (دسامبر ۲۰۰۹)، دشواری‌های تحمیلی ماتریس کانولوشن PNM سرانجام با گزینه‌های -matrix و -matrixfile پایان یافت. در این بین، pnmconvol برای مدتی خراب بود زیرا کتابخانهٔ Netpbm شروع به اعمال این الزام کرد که مقدار یک نمونه نباید از maxval تصویر تجاوز کند. pnmconvol از کتابخانهٔ Netpbm برای خواندن فایل ماتریس کانولوشن PNM استفاده می‌کرد، اما در قالب شبه-PNM که توسط pnmconvol استفاده می‌شود، گاهی نیاز بود که مقدار یک نمونه از maxval بیشتر باشد.

pnmsmooth(1), pgmmorphconv(1), pgmmedian(1), pnmnlfilt(1), pgmkernel(1), pamgauss(1), pammasksharpen(1), pnmpad(1), pamcut(1), pnm(1)

حق نشر (C) 1989، 1991 متعلق به Jef Poskanzer. ویرایش‌شده در ۲۶ نوامبر ۱۹۹۴ توسط Mike Burns، burns@chem.psu.edu

این صفحه راهنما توسط ابزار Netpbm با نام 'makeman' از منبع HTML تولید شده است. مستندات اصلی در نشانی زیر قرار دارد:

http://netpbm.sourceforge.net/doc/pnmconvol.html
30 November 2018 netpbm documentation