ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Алгоритмизации ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅/сниТСниС контрастности — это, соотвСтствСнно, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅/Π΄Π΅Π»Π΅Π½ΠΈΠ΅ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фиксированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ ΠΈ, соотвСтствСнно, ΠΊ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‘Ρ‚ΠΊΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ сущСствуСт Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ контрастности Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡŽ срСднСй яркости ΠΏΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, поэтому ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ. Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Алгоритмизации ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚

ΠŸΠΎΡΡΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ записка ΠΊ ΠΊΡƒΡ€ΡΠΎΠ²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅: 23 страницы, 1 ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, 12 рисунков.

ЦСль Ρ€Π°Π±ΠΎΡ‚Ρ‹ — практичСскоС Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ тСорСтичСской части курса ΠΈ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠ΅ Π½Π°Π²Ρ‹ΠΊΠΎΠ² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ .

Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ, ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° яркостСй, гистограмма, бинаризация, Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого, Π½Π΅Π³Π°Ρ‚ΠΈΠ², Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡˆΡƒΠΌΠΎΠ², Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ.

1. Лист Π·Π°Π΄Π°Π½ΠΈΠΉ

2. ОписаниС поставлСнных Π·Π°Π΄Π°Ρ‡

2.1 Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Π³ΠΈΡΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ изобраТСния

2.2 ИзмСнСниС яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности

2.3 Бинаризация

2.4 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ°ΠΌ сСрого

2.5 НСгатив

2.6 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

2.7 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°

3. Алгоритмы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

3.1 РасчСт Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ яркостСй. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм

3.2 ИзмСнСниС баланса изобраТСния

3.3 Бинаризация

3.4 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² ΠΏΠΎΠ»ΡƒΡ‚ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

3.5 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² Π½Π΅Π³Π°Ρ‚ΠΈΠ²

3.6 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

3.7 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°

4. ОписаниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

4.1 Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСня

4.2 ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ яркостСй ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм

4.3 ИзмСнСниС яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности изобраТСния

4.4 Бинаризация изобраТСния

4.5 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ изобраТСния Π² Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого

4.6 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния Π² Π½Π΅Π°Π³Ρ‚ΠΈΠ²

4.7 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

4.8 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π’Ρ‹Π²ΠΎΠ΄ Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ А

80 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ срСдствами Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π° с ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ срСдой, Ρ‚. Π΅. с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°ΡˆΠΈΡ… Π³Π»Π°Π·. Π§Π΅Π»ΠΎΠ²Π΅ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ зрСния распознаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, воспринимаСт ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, Ρ„ΠΎΡ€ΠΌΡƒ ΠΈ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡΡ‚ранствС. Π’ Π½Π°ΡˆΠ΅ врСмя этим Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ практичСски Π²ΠΎ Π²ΡΠ΅ΠΌ, ΠΈ Ρ‡Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ качСство изобраТСния, Ρ‡Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ прСподнСсСно, Ρ‚Π΅ΠΌ большС внимания Π½Π° Π½Π΅Π³ΠΎ обратят люди ΠΈ Ρ‚Π΅ΠΌ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ усвоят, вСдь Π³ΠΎΡ€Π°Π·Π΄ΠΎ приятнСС ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ, ΡΡ€ΠΊΡƒΡŽ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡŽ, Ρ‡Π΅ΠΌ Π½Π° ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅Π²Π·Ρ€Π°Ρ‡Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ.

ΠŸΡ€ΠΈ просмотрС Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΈ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ€Π°Π· Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ качСства изобраТСния. БСйчас имССтся достаточно большоС количСство Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ «ΠΏΠΎΡ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»Π°Π·». Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сильно яркими ΠΈΠ»ΠΈ Ρ‚Π΅ΠΌΠ½Ρ‹ΠΌΠΈ, «ΠΏΠΎΠ»ΠΈΠ½ΡΠ²ΡˆΠΈΠΌΠΈ», Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎΡ‚ курсовой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ посвящСн Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ (Ρ…ΠΎΡ‚ΡŒ ΠΈ Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ) качСство изобраТСния.

1. Лист задания

1. Π’Ρ‹Π²ΠΎΠ΄ изобраТСния Π½Π° ΡΠΊΡ€Π°Π½.

2. Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ яркости изобраТСния.

3. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм.

4. ИзмСнСниС цвСтности:

Β· бинаризация (ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‡Ρ‘Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠΌΡƒ);

Β· ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ°ΠΌ сСрого;

Β· Π½Π΅Π³Π°Ρ‚ΠΈΠ²

5. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ измСнСния яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности.

6. Π—Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ:

— ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

2. ОписаниС поставлСнных Π·Π°Π΄Π°Ρ‡

2.1 Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ Π³ΠΈΡΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ изобраТСния ЧСловСчСский Π³Π»Π°Π· Π±ΠΎΠ»Π΅Π΅ чувствитСлСн ΠΊ Π·Π΅Π»Π΅Π½ΠΎΠΌΡƒ Ρ†Π²Π΅Ρ‚Ρƒ, Ρ‡Π΅ΠΌ ΠΊ ΠΊΡ€Π°ΡΠ½ΠΎΠΌΡƒ ΠΈ ΡΠΈΠ½Π΅ΠΌΡƒ вмСстС взятым. Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ Π·Π΅Π»Π΅Π½Ρ‹ΠΌ пиксСлям Π΄Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ каТСтся ΠΌΠ΅Π½Π΅Π΅ ΡˆΡƒΠΌΠ½Ρ‹ΠΌ ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅Ρ‚ΠΊΠΈΠΌ, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π²Π½ΠΎΠΌ количСствС Ρ†Π²Π΅Ρ‚ΠΎΠ². Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля находится ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

Y:=0.3*R+0.59*G+0.11*B

Гистограмма — это прСдставлСнная Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ числа ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния яркости Π½Π° Π²ΡΡ‘ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ‚ ΡΡ‚ΠΎΠ³ΠΎ самого значСния. Для изобраТСния ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ 4 Π²ΠΈΠ΄Π° гистограмм: 3 ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ (RGB) ΠΈ ΠΎΠ΄Π½Ρƒ ΠΏΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½Π½ΠΎΠΉ яркости.

2.2 ИзмСнСниС яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности Π­Ρ‚ΠΈ измСнСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ «ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ баланса изобраТСния», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΡ€ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ схоТи, ΠΈ ΠΎΡ‚носятся ΠΊ ΡΡ„Π΅Ρ€Π΅ восприятия изобраТСния Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ, Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΡ€ΠΊΠΎΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ количСство Π±Π΅Π»ΠΎΠ³ΠΎ (обСсцвСчиваСт) ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° ΠΊΠΎΠ½Ρ‚раст, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ количСство Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ (Ρ‚Π΅Π½Π΅ΠΉ).

ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅/сниТСниС яркости — это, соотвСтствСнно, слоТСниС/Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ фиксированным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΡ‚ 0 Π΄ΠΎ 255. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΊΠ°Π½Π°Π»Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° 0.255.

ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅/сниТСниС контрастности — это, соотвСтствСнно, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅/Π΄Π΅Π»Π΅Π½ΠΈΠ΅ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фиксированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ ΠΈ, соотвСтствСнно, ΠΊ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‘Ρ‚ΠΊΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ сущСствуСт Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ контрастности Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡŽ срСднСй яркости ΠΏΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, поэтому ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ:

NewY:=K*(OldY-AveY)+AveY

Π’ ΡΡ‚ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ NewY — Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ², K — коэффициСнт контрастности (K=(0.1) — сниТСниС, K<1 — ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ контрастности), OldY — Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ°Π½Π°Π»Π°, AveY — срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ. ΠšΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π΅Π³ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ 0.255 ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

2.3 Бинаризация Бинаризация — это ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, ΠΊ ΠΎΠ΄Π½ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΌΡƒ (Ρ‡Π°Ρ‰Π΅ всСго ΠΊ Ρ‡Π΅Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠΌΡƒ). ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΠΈΠ½Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ выбираСтся Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΡ€ΠΎΠ³ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 155), всС значСния Π½ΠΈΠΆΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°, Π° Π²Ρ‹ΡˆΠ΅ — Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚. Π‘Π°ΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ, Π½ΠΎ Π² ΡΡ‚ΠΎΠΌ случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΏΡ€ΡΠΌΠΎΠΌ смыслС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ (Ρ‡Ρ‘Ρ€Π½ΠΎ-Π±Π΅Π»Ρ‹ΠΌ), Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ 8 чистых Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ чистых красного, Π·Π΅Π»Ρ‘Π½ΠΎΠ³ΠΎ ΠΈ Π³ΠΎΠ»ΡƒΠ±ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°Π΄ «ΠΏΠΎΠ»Π½Ρ‹ΠΌ» Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ.

2.4 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ°ΠΌ сСрого ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ°ΠΌ сСрого Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ яркости ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΠΎΠΉ Ρ€Π°Π½Π΅Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ Y:=0.3*R+0.59*G+0.11*B, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ значСния Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ² RGB.

2.5 НСгатив ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π° происходит простой Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния ΠΊΠ°Π½Π°Π»Π° Π½Π° Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ 255. НапримСр, R=255-R.

2.6 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π¨ΡƒΠΌ изобраТСния — это Π΄Π΅Ρ„Π΅ΠΊΡ‚ качСства Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ³ΠΎ снимка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΡΡ€ΠΊΠΎΡΡ‚ΠΈ.

Для ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π½Π°Ρ‡Π°Π»Π° Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ искусствСнный ΡˆΡƒΠΌ. Π—Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ способом, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ значСния ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ изобраТСния. Алгоритмы налоТСния ΡˆΡƒΠΌΠΎΠ² (Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ, ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½Ρ‹ΠΉ) Π±ΡƒΠ΄ΡƒΡ‚ описаны дальшС.

2.7 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΡˆΡƒΠΌΠ°. Для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ понятиС Π°ΠΏΠ΅Ρ€Ρ‚ΡƒΡ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° — Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠΉ части изобраТСния, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нСпосрСдствСнно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ пСрСдвигаСтся ΠΏΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ всС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π‘ΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ опрСдСляСт особый Π²ΠΈΠ΄ пСрСдвиТСния Π°ΠΏΠ΅Ρ€Ρ‚ΡƒΡ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ достиТСнии Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ изобраТСния ΠΎΠΊΠ½ΠΎ опускаСтся Π½Π° 1 пиксСль Π²Π½ΠΈΠ· ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠŸΡ€ΠΈ этом Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡˆΠ°Π³Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ пиксСли.

НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ яркости ΠΈΠ»ΠΈ насыщСнности Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² ΠΎΠΊΠ½Π΅ пиксСля устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ сСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями яркости ΠΈΠ»ΠΈ насыщСнности Π΅Π³ΠΎ сосСдСй.

3. Алгоритмы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

3.1 РасчСт Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ яркостСй. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ яркостСй Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½ΠΈ яркости для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля ΠΈ Π·Π°Π½Π΅ΡΡ‚ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ (DataGridView Π² Π½Π°ΡˆΠ΅ΠΌ случаС). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля примСняСм Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ Π“Π΄Π΅ i, j — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ пиксСля, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ яркости, -ΡƒΡ€ΠΎΠ²Π½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² для Π΄Π°Π½Π½ΠΎΠ³ΠΎ пиксСля.

Для построСния гистограмм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство пиксСлСй для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня яркости ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня насыщСнности ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ RGB. ΠŸΡ€ΠΈ построСнии гистограммы яркостСй ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ рассчитанной Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ яркости ΠΈ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство пиксСлСй для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня яркости. ПослС Ρ‡Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ построСниС гистограммы. Для гистограмм ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ RGB Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π΄ уровнями насыщСнности ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ².

3.2 ИзмСнСниС баланса изобраТСния ИзмСнСниС яркости проводится ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ² пиксСля, послС Ρ‡Π΅Π³ΠΎ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΡΡ‚ΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фиксированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ прСобразования яркости: ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ яркости — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Π° ΠΏΡ€ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ — ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

ПослС суммирования Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ уровня ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° с Ρ„иксированным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Ρ‹, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΎΠ½ΠΎ Π²Ρ‹ΡˆΠ»ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ .

Для измСнСния контраста изобраТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ² RGB для всСго изобраТСния.

Π“Π΄Π΅ N — количСство пиксСлСй, n-ΡˆΠΈΡ€ΠΈΠ½Π°, m-высота изобраТСния, — ΡƒΡ€ΠΎΠ²Π½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² для пиксСля ΠΏΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ .

ПослС этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ коэффициСнт прСобразования K, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°ΠΌΠΈ:

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Ρ‹, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΎΠ½ΠΎ Π²Ρ‹ΡˆΠ»ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

3.3 Бинаризация ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΠΈΠ½Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΡ€ΠΎΠ³ Π±ΠΈΠ½Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ ΡΡ‚ΠΈΡ… цСлях сначала строим гистограммы изобраТСния, послС Ρ‡Π΅Π³ΠΎ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ гистограммС Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ яркости, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ условно Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΠΎΠ½ изобраТСния ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠΎΡ€ΠΎΠ³ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΡ€ΠΈ этом ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большСго количСства Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½Π΅ΡΡƒΡ‚ Π² ΡΠ΅Π±Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

ПослС прСобразования ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π΄Π²ΡƒΡ… Ρ†Π²Π΅Ρ‚ΠΎΠ².

3.4 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² ΠΏΠΎΠ»ΡƒΡ‚ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния Π² ΠΏΠΎΠ»ΡƒΡ‚ΠΎΠ½ΠΎΠ²ΠΎΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ пиксСлю ΠΏΠΎ Π²ΡΠ΅ΠΌ Ρ‚Ρ€Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ RGB ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ яркости этого пиксСля. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сначала Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡΡ€ΠΊΠΎΡΡ‚ΡŒ пиксСля ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ присваиваСтся всСм Ρ‚Ρ€Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ:

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°Ρ… i, j-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ пиксСля, — ΡƒΡ€ΠΎΠ²Π½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² для пиксСля ΠΏΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ .

Π”Π°Π½Π½Ρ‹Π΅ прСобразования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля для получСния ΠΏΠΎΠ»ΡƒΡ‚ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ изобраТСния.

3.5 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² Π½Π΅Π³Π°Ρ‚ΠΈΠ² ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния ΠΊ Π΅Π³ΠΎ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Ρƒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΠΏΠΎ Π²ΡΠ΅ΠΌ Ρ‚Ρ€Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ RGB ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ старого Π΄ΠΎ 255.

Π“Π΄Π΅Π½ΠΎΠ²Ρ‹Π΅ значСния ΠΊΠ°Π½Π°Π»ΠΎΠ², i, j-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ пиксСля.

3.6 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ НалоТСниС ΡˆΡƒΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠ°Π½Π°Π»Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… случайных пиксСлСй. Для налоТСния ΡˆΡƒΠΌΠΎΠ² сначала Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ число пиксСлСй Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΎ. Π­Ρ‚ΠΎ число ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π»ΠΈΠ±ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ псСвдослучайных чисСл.

Π—Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайныС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… изобраТСния для этих пиксСлСй. ПослС Ρ‡Π΅Π³ΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π»ΠΈΠ±ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² RGB ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ случайноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ПослС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ Π½ΠΎΠ²Ρ‹Π΅ значСния.

3.6.1 НалоТСниС Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Бмысл Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ яркости ΠΈΠ»ΠΈ значСния Ρ†Π²Π΅Ρ‚Π° пиксСля Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ (случайным) для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ.

3.6.2 НалоТСниС ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Бмысл ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ яркости ΠΈΠ»ΠΈ значСния Ρ†Π²Π΅Ρ‚Π° пиксСля Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, значСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Π»ΠΈΠ·ΠΊΠΈ ΠΊ 1 ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ (случайны).

3.6.3 НалоТСниС ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Бмысл ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΠΈ яркости ΠΈΠ»ΠΈ Ρ†Π²Π΅Ρ‚Π° пиксСля Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ‚СряСт Π²ΡΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ нСискаТСнном Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ.

3.7 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Для выполнСния Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π°ΠΏΠ΅Ρ€Ρ‚ΡƒΡ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° бСрСтся Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ 3×3, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ смысл Π²Π·ΡΡ‚ΡŒ Π°ΠΏΠ΅Ρ€Ρ‚ΡƒΡ€Ρƒ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠ΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΎΠΊΠ½ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Маска для Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄ (ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ ΠΈ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ):

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡƒΠΌ, ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ срСднСС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, ΠΏΠΎ Π²ΡΠ΅ΠΌ Ρ‚Ρ€Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ.

ПослС Ρ‡Π΅Π³ΠΎ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. ΠŸΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вычислСниях Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠΊΠ½ΠΎΠΌ, состоящим Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² исходного изобраТСния, Π½ΠΎ ΠΈ ΠΈΠ· элСмСнтов, Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π½ΡƒΠ²ΡˆΠΈΡ…ΡΡ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ.

4. ОписаниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

4.1 Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° изобраТСния ПослС запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡΠΊΡ€Π°Π½Π΅ появится Ρ„ΠΎΡ€ΠΌΠ°, изобраТСнная Π½Π° Ρ€ΠΈΡ. 4.1.1:

Рис. 4.1.1

Π’. К. это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‚ΠΎ Π΄Π»Ρ Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ трСмя способами:

— Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ² Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅»;

— Π·Π°ΠΉΡ‚ΠΈ Π² «ΠœΠ΅Π½ΡŽ->Π€Π°ΠΉΠ»->ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ»;

— Π³ΠΎΡ€ΡΡ‡Π΅ΠΉ клавишСй «Ctrl+O»;

ВсС эти Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡŽ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ изобраТСния Ρ‚ΠΈΠΏΠ° :*bmp, *.jpg, *.jpeg, *.png, *.tif, *.tiff. ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ изобраТСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΠΎΠΊΠ½Π΅ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Ρ€ΠΈΡ. 4.1.2:

Рис. 4.1.2

4.2 ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ яркостСй ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм Для получСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ яркостСй Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π½Π΅Π΅ изобраТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° яркостСй», послС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСкунд оТидания Π½Π° ΡΠΊΡ€Π°Π½Π΅ появится Ρ„ΠΎΡ€ΠΌΠ° показанная Π½Π° Ρ€ΠΈΡ. 4.2.3

Рис. 4.2.3

Π’ ΡΡ‚ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ значСния яркостСй ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ пиксСлю, ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ яркости. Π›ΡŽΠ±ΡƒΡŽ ΠΈΠ· ΡΡ‚ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Excel, пСрСйдя Π² «ΠœΠ΅Π½ΡŽ->ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°->Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ_β„–».

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ двумя способами:

— Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ гистограмм»;

— ΠΏΠΎΡΠ»Π΅ получСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ† яркостСй Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² «ΠœΠ΅Π½ΡŽ->Гистограмма->ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅»;

На ΡΠΊΡ€Π°Π½Π΅ появится Ρ„ΠΎΡ€ΠΌΠ°, изобраТСнная Π½Π° Ρ€ΠΈΡ. 4.2.4:

Рис. 4.2.4

ВсС гистограммы Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ пСрСйдя Π² «ΠœΠ΅Π½ΡŽ->Гистограмма->Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅->Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ_β„–».

4.3 ИзмСнСниС яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности изобраТСния ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ изобраТСния станут доступными Π±Π΅Π³ΡƒΠ½ΠΊΠΈ «Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ» ΠΈ «ΠšΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ», ΠΏΡ€ΠΈ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ соотвСтствСнно ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ яркости ΠΈ ΠΊΠΎΠ½Ρ‚растности (рис. 4.3.1):

Рис. 4.3.1

4.4 Бинаризация изобраТСния ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Π±ΠΈΠ½Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΡ€ΠΎΠ³ Π±ΠΈΠ½Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² ΠΏΠΎΠ»Π΅ рядом с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ «Π‘инаризация"(рис. 4.4.1):

Рис. 4.4.1

ПослС Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΡ€ΠΎΠ³Π° ΠΈ Π½Π°ΠΆΠ°Ρ‚ия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π‘инаризация» ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΡΡ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠΊΠ½Π΅ (рис. 4.4.2):

Рис. 4.4.2

private void bBinary_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_binary = (byte)numericUpDown1.Value;

byte cc_r, cc_g, cc_b, cc_bright;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//ВычисляСм ΡΡ€ΠΊΠΎΡΡ‚ΡŒ

cc_bright = (byte)Math.Round (cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π° (Π±Π΅Π»Ρ‹ΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ)

if (cc_bright > cc_binary)

{

*pixel_gr = 255;

pixel_gr++;

*pixel_gr = 255;

pixel_gr++;

*pixel_gr = 255;

}

else

{

*pixel_gr = 0;

pixel_gr++;

*pixel_gr = 0;

pixel_gr++;

*pixel_gr = 0;

}

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}}

4.5 ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого Π—Π΄Π΅ΡΡŒ ΡƒΠΆΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ€ΠΎΠ³Π° Π½Π΅Ρ‚, поэтому для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° изобраТСния Π² Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ сСрого просто ΠΆΠΌΠ΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π‘Π΅Ρ€ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅» (рис. 4.5.1):

Рис. 4.5.1

private void bGray_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_r, cc_g, cc_b, cc_gray;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//ВычисляСм сСрый

cc_gray = (byte)Math.Round (cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π°

*pixel_gr = cc_gray;

pixel_gr++;

*pixel_gr = cc_gray;

pixel_gr++;

*pixel_gr = cc_gray;

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}}

4.6 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния Π² Π½Π΅Π³Π°Ρ‚ΠΈΠ² Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС, всС ΠΎΡ‡Π΅Π½ΡŒ просто, достаточно Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° «ΠΠ΅Π³Π°Ρ‚ΠΈΠ²» ΠΈ Π²ΡƒΠ°Π»Ρ (рис. 4.6.1):

Рис. 4.6.1

private void bNegative_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_r, cc_g, cc_b;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π°

*pixel_gr = (byte)(255 — cc_b);

//*pixel_gr++;

*(pixel_gr + 1) = (byte)(255 — cc_g);

//*pixel_gr++;

*(pixel_gr + 2) = (byte)(255 — cc_r);

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}

}

ВсС измСнСния, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ пСрСчислСнных ΠΏΡƒΠ½ΠΊΡ‚Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π° Π΄ΠΈΡΠΊ пСрСйдя Π² «ΠœΠ΅Π½ΡŽ->Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ», Π»ΠΈΠ±ΠΎ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½Ρ‹Π΅ дСйствия Π½Π°ΠΆΠ°Π² Π½Π° «Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅».

4.7 НалоТСниС ΡˆΡƒΠΌΠΎΠ² Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Как Π±Ρ‹Π»ΠΎ упомянуто, Π²Ρ‹ΡˆΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ… Π²ΠΈΠ΄ΠΎΠ² ΡˆΡƒΠΌΠΎΠ², для Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ изобраТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² «ΠœΠ΅Π½ΡŽ->НалоТСниС ΡˆΡƒΠΌΠΎΠ²» ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΡˆΡƒΠΌ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ (рис. 4.7.1):

Рис. 4.7.1

4.8 ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ сСрСдины Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Для Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»Π° использована простая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° с Π±Π΅Π»Ρ‹ΠΌ, ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹ΠΌ Ρ„ΠΎΠ½ΠΎΠΌ. Π”Π°Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ срСднСго ΠΌΠ΅ΠΆΠ΄Ρƒ максимумом (Π±Π΅Π»Ρ‹ΠΌ Ρ„ΠΎΠ½ΠΎΠΌ) ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠΌ (ΡˆΡƒΠΌΠΎΠΌ Π½Π° Π±Π΅Π»ΠΎΠΌ Ρ„ΠΎΠ½Π΅) ΠΎΠ½ΠΎ получаСтся Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π±Π΅Π»ΠΎΠ΅, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° Π±Π΅Π»ΠΎΠΌ Ρ„ΠΎΠ½Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ пятна (рис. 4.8.1):

Рис. 4.8.1

Если Π²Π·ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ (рис. 4.8.2):

Π”ΠΎ ΠŸΠΎΡΠ»Π΅ Рис. 4.8.2

Для Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° нСдостатка Ρ€Π°Π½Π³ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π½Π° Ρ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ (МСдианная Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ, ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΎΠ½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ срСднСго, Π½ΠΎ Π½Π΅ Π² ΡΠΌΡ‹ΡΠ»Π΅ срСднСго арифмСтичСского, Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ располоТСн посрСдинС (5 элСмСнт) ΠΈΠ· ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½Ρ‹Ρ… дСвяти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (Π² ΡΠ»ΡƒΡ‡Π°Π΅ Π°ΠΏΠ΅Ρ€Ρ‚ΡƒΡ€Ρ‹ = 3×3)), Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π° Ρ€ΠΈΡ. 4.8.3:

Рис. 4.8.3

ΠŸΠΎΠ»Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ пСрСчислСнных Π²Ρ‹ΡˆΠ΅ дСйствий ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹ Π’ Ρ…ΠΎΠ΄Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ мною Π±Ρ‹Π»ΠΈ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π° тСорСтичСская Ρ‡Π°ΡΡ‚ΡŒ курса ΠΈ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Ρ‹ практичСскиС Π½Π°Π²Ρ‹ΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Разработанная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ дСйствий Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° ΠΏΡ€ΠΎΠΈΡΡ…одят автоматичСски. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² ΡΡ€Π΅Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Visual Studio, Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ программирования C#.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

1. ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ указания ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ курсового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΎ ΠΊΡƒΡ€ΡΡƒ «ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ»;

2. ГонсалСс Π ., Вудс Π . — Π¦ΠΈΡ„ровая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ;

3. Яншин — ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Π‘ΠΈ;

4. Ярославский — Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ;

ΡΡ€ΠΊΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡˆΡƒΠΌ Π½Π΅Π³Π°Ρ‚ΠΈΠ²

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, А Π›ΠΈΡΡ‚ΠΈΠ½Π³ класса Form1. cs:

using System;

using System.Collections.Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System.Windows.Forms;

using System.Drawing.Imaging;

namespace Kursach

{

public partial class Form1: Form

{

Bitmap bitmap1;

Graphics graphics1, g;

Image MemForImage;

int FLAG = 0, Z = 1;

string name, filename;

private Color selectionColor;

DopForm Form2 = new DopForm ();

public Form1()

{

InitializeComponent ();

}

private void LoadImage (bool jpg)

{

openFileDialog1.InitialDirectory = «» ;

if (jpg)

openFileDialog1.Filter = «All Graphics Types|*.bmp;*.jpg;*.jpeg;*.png;*.tif;*.tiff» ;

if (openFileDialog1.ShowDialog () == DialogResult. OK)

{

try

{

MemForImage = Image. FromFile (openFileDialog1.FileName);

pictureBox1.BackgroundImageLayout = ImageLayout. Zoom;

pictureBox1.BackgroundImage = MemForImage;

using (Bitmap bmp = new Bitmap (pictureBox1.BackgroundImage))

{

selectionColor = GetDominantColor (bmp, false);

selectionColor = CalculateOppositeColor (selectionColor);

}

}

catch (Exception ex)

{

MessageBox.Show («ΠžΡˆΠΈΠ±ΠΊΠ° ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅» + ex. Message);

}

}

}

/// Returns the dominant color of an image

private Color GetDominantColor (Bitmap bmp, bool includeAlpha)

{

// GDI+ still lies to us — the return format is BGRA, NOT ARGB.

BitmapData bmData = bmp. LockBits (new Rectangle (0, 0, bmp. Width, bmp. Height),

ImageLockMode.ReadWrite,

PixelFormat.Format32bppArgb);

int stride = bmData. Stride;

IntPtr Scan0 = bmData. Scan0;

int r = 0;

int g = 0;

int b = 0;

int a = 0;

int total = 0;

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride — bmp. Width * 4;

int nWidth = bmp. Width;

for (int y = 0; y < bmp. Height; y++)

{

for (int x = 0; x < nWidth; x++)

{

r += p[0];

g += p[1];

b += p[2];

a += p[3];

total++;

p += 4;

}

p += nOffset;

}

}

bmp.UnlockBits (bmData);

r /= total;

g /= total;

b /= total;

a /= total;

if (includeAlpha)

return Color. FromArgb (a, r, g, b);

else

return Color. FromArgb (r, g, b);

}

/// Calculates the opposite color of a given color.

/// Source: http://dotnetpulse.blogspot.com/2007/01/function-to-calculate-opposite-color.html

private Color CalculateOppositeColor (Color clr)

{

return Color. FromArgb (255 — clr. R, 255 — clr. G, 255 — clr. B);

}

private void button1_Click (object sender, EventArgs e)

{

LoadImage (true);

label1.Text = «Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ:» ;

label2.Text = «ΠšΠΎΠ½Ρ‚раст:» ;

trackBar1.Enabled = true;

trackBar1.Value = 50;

trackBar2.Enabled = true;

trackBar2.Value = 50;

}

private void Form1_Load (object sender, EventArgs e)

{

bitmap1 = new Bitmap (pictureBox1.Width, pictureBox1. Height);

graphics1 = Graphics. FromImage (bitmap1);

}

private void button2_Click (object sender, EventArgs e)

{

DialogResult rsl = MessageBox. Show («Π₯ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΉΡ‚ΠΈ?», «Π’Ρ‹Ρ…ΠΎΠ΄», MessageBoxButtons. YesNo, MessageBoxIcon. Question);

if (rsl == DialogResult. Yes)

Application.Exit ();

}

private void button3_Click (object sender, EventArgs e)

{

button4_Click (sender, e);

Form2.построСниСToolStripMenuItem_Click (sender, e);

}

private void button4_Click (object sender, EventArgs e)

{

int i, j, fl = 0;

Color mycol;

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int[,] r = new int[picture.Height, picture. Width];

int[,] g = new int[picture.Height, picture. Width];

int[,] b = new int[picture.Height, picture. Width];

int[,] br = new int[picture.Height, picture. Width];

Form2.dataGridView1.Rows.Clear ();

Form2.dataGridView1.Columns.Clear ();

Form2.dataGridView2.Rows.Clear ();

Form2.dataGridView2.Columns.Clear ();

Form2.dataGridView3.Rows.Clear ();

Form2.dataGridView3.Columns.Clear ();

Form2.dataGridView4.Rows.Clear ();

Form2.dataGridView4.Columns.Clear ();

for (i = 0; i < picture. Height — 1; i++)

{

for (j = 0; j < picture. Width — 1; j++)

}

progressBar1.Minimum = 1;

progressBar1.Value = 1;

progressBar1.Step = 1;

if (fl == 0)

{

progressBar1.Maximum = picture. Height * picture. Width + picture. Width;

Form2.dataGridView1.RowCount = picture. Height;

Form2.dataGridView1.ColumnCount = picture. Width + 1;

Form2.dataGridView1.Columns[0]. Name = «β„–» ;

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView1.Columns[j + 1]. Name = Convert. ToString (j + 1);

progressBar1.PerformStep ();

}

for (i = 0; i < picture. Height — 1; i++)

{

Form2.dataGridView1.Rows[i]. Cells[0].Value = Convert. ToString (i + 1);

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView1.Rows[i]. Cells[j + 1]. Value = br[i, j];

progressBar1.PerformStep ();

}

}

Form2.label10.Text = «1» ;

}

else

{

progressBar1.Maximum = 4 * (picture.Height * picture. Width) + 4* picture. Width;

Form2.dataGridView1.RowCount = picture. Height;

Form2.dataGridView1.ColumnCount = picture. Width + 1;

Form2.dataGridView1.Columns[0]. Name = «β„–» ;

Form2.dataGridView2.RowCount = picture. Height;

Form2.dataGridView2.ColumnCount = picture. Width + 1;

Form2.dataGridView2.Columns[0]. Name = «β„–» ;

Form2.dataGridView3.RowCount = picture. Height;

Form2.dataGridView3.ColumnCount = picture. Width + 1;

Form2.dataGridView3.Columns[0]. Name = «β„–» ;

Form2.dataGridView4.RowCount = picture. Height;

Form2.dataGridView4.ColumnCount = picture. Width + 1;

Form2.dataGridView4.Columns[0]. Name = «β„–» ;

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView1.Columns[j + 1]. Name = Convert. ToString (j + 1);

progressBar1.PerformStep ();

}

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView2.Columns[j + 1]. Name = Convert. ToString (j + 1);

progressBar1.PerformStep ();

}

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView3.Columns[j + 1]. Name = Convert. ToString (j + 1);

progressBar1.PerformStep ();

}

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView4.Columns[j + 1]. Name = Convert. ToString (j + 1);

progressBar1.PerformStep ();

}

for (i = 0; i < picture. Height — 1; i++)

{

Form2.dataGridView1.Rows[i]. Cells[0].Value = Convert. ToString (i + 1);

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView1.Rows[i]. Cells[j + 1]. Value = br[i, j];

progressBar1.PerformStep ();

}

}

for (i = 0; i < picture. Height — 1; i++)

{

Form2.dataGridView2.Rows[i]. Cells[0].Value = Convert. ToString (i + 1);

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView2.Rows[i]. Cells[j + 1]. Value = r[i, j];

progressBar1.PerformStep ();

}

}

for (i = 0; i < picture. Height — 1; i++)

{

Form2.dataGridView3.Rows[i]. Cells[0].Value = Convert. ToString (i + 1);

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView3.Rows[i]. Cells[j + 1]. Value = g[i, j];

progressBar1.PerformStep ();

}

}

for (i = 0; i < picture. Height — 1; i++)

{

Form2.dataGridView4.Rows[i]. Cells[0].Value = Convert. ToString (i + 1);

for (j = 0; j < picture. Width — 1; j++)

{

Form2.dataGridView4.Rows[i]. Cells[j + 1]. Value = b[i, j];

progressBar1.PerformStep ();

}

}

Form2.label10.Text = «3» ;

}

Form2.Show ();

}

private void button5_Click (object sender, EventArgs e)

{

Form2.Show ();

}

private void button6_Click (object sender, EventArgs e)

{

try

{

MemForImage = Image. FromFile (openFileDialog1.FileName);

pictureBox1.BackgroundImageLayout = ImageLayout. Zoom;

pictureBox1.BackgroundImage = MemForImage;

using (Bitmap bmp = new Bitmap (pictureBox1.BackgroundImage))

{

selectionColor = GetDominantColor (bmp, false);

selectionColor = CalculateOppositeColor (selectionColor);

}

}

catch (Exception ex)

{

MessageBox.Show («ΠžΡˆΠΈΠ±ΠΊΠ° ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅» + ex. Message);

}

label1.Text = «Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ:» ;

label2.Text = «ΠšΠΎΠ½Ρ‚раст:» ;

trackBar1.Value = 50;

trackBar2.Value = 50;

}

private void ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒToolStripMenuItem_Click (object sender, EventArgs e)

{

Graphics gr = graphics1;

PictureBox pb = pictureBox1;

gr = pb. CreateGraphics ();

SaveFileDialog savedialog = new SaveFileDialog ();

savedialog.Title = «Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊ …» ;

savedialog.OverwritePrompt = true;

savedialog.CheckPathExists = true;

savedialog.Filter =

openFileDialog1.Filter = //" JPEG — Π€ΠΎΡ€ΠΌΠ°Ρ‚ изобраТСния|*.jpg" ;

" JPEG File (*.jpg)|*.jpg|" +

" Bitmap File (*.bmp)|*.bmp|" +

" GIF File (*.gif)|*.gif|" +

" TIF File (*.tif)|*.tif|" +

" PNG File (*.png)|*.png" ;

savedialog.ShowHelp = true;

Rectangle r = pb. RectangleToScreen (pb.ClientRectangle);

Bitmap b = new Bitmap (r.Width, r. Height);

Graphics g = Graphics. FromImage (b);

g.CopyFromScreen (r.Location, new Point (0, 0), r. Size);

if (savedialog.ShowDialog () == DialogResult. OK)

{

// Get the user-selected file name

string fileName = savedialog. FileName;

// Get the extension

string strFilExtn =

fileName.Remove (0, fileName. Length — 3);

// Save file

pb.BackColor = System.Drawing.Color.Transparent;

name = strFilExtn;

filename = fileName;

}

switch (name)

{

case «bmp» :

pb.Image.Save (filename, System.Drawing.Imaging.ImageFormat.Bmp);

break;

case «jpg» :

b.Save (filename);

break;

case «gif» :

pb.Image.Save (filename, System.Drawing.Imaging.ImageFormat.Gif);

break;

case «tif» :

pb.Image.Save (filename, System.Drawing.Imaging.ImageFormat.Tiff);

break;

case «png» :

pb.Image.Save (filename, System.Drawing.Imaging.ImageFormat.Png);

break;

default:

break;

}

try

{

process1 = new System.Diagnostics.Process ();

this.process1.StartInfo.Domain = «» ;

this.process1.StartInfo.LoadUserProfile = false;

this.process1.StartInfo.Password = null;

this.process1.StartInfo.StandardErrorEncoding = null;

this.process1.StartInfo.StandardOutputEncoding = null;

this.process1.StartInfo.UserName = «» ;

this.process1.SynchronizingObject = this;

process1.StartInfo.FileName = filename;

process1.EnableRaisingEvents = true;

process1.Start ();

}

catch { }

}

private void button7_Click (object sender, EventArgs e)

{

ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒToolStripMenuItem_Click (sender, e);

}

private void button8_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_r, cc_g, cc_b, cc_gray;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//ВычисляСм сСрый

cc_gray = (byte)Math.Round (cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π°

*pixel_gr = cc_gray;

pixel_gr++;

*pixel_gr = cc_gray;

pixel_gr++;

*pixel_gr = cc_gray;

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}

}

private void button10_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_r, cc_g, cc_b;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π°

*pixel_gr = (byte)(255 — cc_b);

//*pixel_gr++;

*(pixel_gr + 1) = (byte)(255 — cc_g);

//*pixel_gr++;

*(pixel_gr + 2) = (byte)(255 — cc_r);

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}

}

private void button9_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

BitmapData bitmap_data;

IntPtr bitmap_pixels;

unsafe

{

//Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ участок Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ

bitmap_data = picture. LockBits (new Rectangle (0, 0, picture. Width, picture. Height), ImageLockMode. ReadWrite, PixelFormat. Format24bppRgb);

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пиксСль

bitmap_pixels = bitmap_data.Scan0;

byte* bitmap_pbitS = (byte*)bitmap_pixels.ToPointer ();

//Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 3 Π±Π°ΠΉΡ‚Π°

byte bytes_per_pixel = 3;

byte cc_binary = (byte)numericUpDown1.Value;

byte cc_r, cc_g, cc_b, cc_bright;

for (int x = 0; x < picture. Width; x++)

{

for (int y = 0; y < picture. Height; y++)

{

//ВычисляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, которая соотвСтствуСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x, y

byte* pixel_gr = (byte*)bitmap_pbitS + (y * bitmap_data.Stride) + (x * bytes_per_pixel);

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ 3 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ†Π²Π΅Ρ‚Π°

cc_b = *pixel_gr;

cc_g = *(pixel_gr + 1);

cc_r = *(pixel_gr + 2);

//ВычисляСм ΡΡ€ΠΊΠΎΡΡ‚ΡŒ

cc_bright = (byte)Math.Round (cc_b * 0.3f + cc_g * 0.59f + cc_r * 0.11f);

//УстанавливаСм Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚Π° (Π±Π΅Π»Ρ‹ΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ)

if (cc_bright > cc_binary)

{

*pixel_gr = 255;

pixel_gr++;

*pixel_gr = 255;

pixel_gr++;

*pixel_gr = 255;

}

else

{

*pixel_gr = 0;

pixel_gr++;

*pixel_gr = 0;

pixel_gr++;

*pixel_gr = 0;

}

}

}

picture.UnlockBits (bitmap_data);

pictureBox1.BackgroundImage = picture;

}

}

public int CorrectColor (int C)

{

if (C >255)

{

return 255;

}

else if (C <0)

{

return 0;

}

else

return C;

}

private void Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, x, y, n;

int r, g, b;

Random rand = new Random ();

progressBar1.Value = 1;

progressBar1.Step = 1;

n = rand. Next (picture.Width * 30, picture. Width * 32);

progressBar1.Maximum = n;

i = 0;

while (i < n)

{

x = rand. Next (0, picture. Width);

y = rand. Next (0, picture. Height);

r = picture. GetPixel (x, y).R + rand. Next (-40, 40);

g = picture. GetPixel (x, y).G + rand. Next (-40, 40);

b = picture. GetPixel (x, y).B + rand. Next (-40, 40);

r = CorrectColor®;

g = CorrectColor (g);

b = CorrectColor (b);

picture.SetPixel (x, y, Color. FromArgb (r, g, b));

i++;

progressBar1.PerformStep ();

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

private void ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, x, y, n;

int r, g, b;

Random rand = new Random ();

progressBar1.Value = 1;

progressBar1.Step = 1;

n = rand. Next (picture.Width * 30, picture. Width * 32);

progressBar1.Maximum = n;

i = 0;

while (i < n)

{

x = rand. Next (0, picture. Width);

y = rand. Next (0, picture. Height);

r = picture. GetPixel (x, y).R;

g = picture. GetPixel (x, y).G;

b = picture. GetPixel (x, y).B;

r = (int)(r * (rand.NextDouble () + 0.5));

g = (int)(g * (rand.NextDouble () + 0.5));

b = (int)(b * (rand.NextDouble () + 0.5));

r = CorrectColor®;

g = CorrectColor (g);

b = CorrectColor (b);

picture.SetPixel (x, y, Color. FromArgb (r, g, b));

i++;

progressBar1.PerformStep ();

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

private void ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½Ρ‹ΠΉToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, x, y, n;

int r, g, b;

Random rand = new Random ();

progressBar1.Value = 1;

progressBar1.Step = 1;

n = rand. Next (picture.Width * 30, picture. Width * 32);

progressBar1.Maximum = n;

i = 0;

while (i < n)

{

x = rand. Next (0, picture. Width);

y = rand. Next (0, picture. Height);

r = rand. Next (0, 256);

g = rand. Next (0, 256);

b = rand. Next (0, 256);

picture.SetPixel (x, y, Color. FromArgb (r, g, b));

i++;

progressBar1.PerformStep ();

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

private void Ρ€Π°Π½Π³ΠΎΠ²Π°ΡΠ€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, j, k, m, count;

int[] R, G, B;

int minR, minG, minB, maxR, maxG, maxB;

int sR, sG, sB;

R = new int[8];

G = new int[8];

B = new int[8];

progressBar1.Value = 1;

progressBar1.Step = 1;

progressBar1.Maximum = picture. Width * picture. Height;

//На элСмСнты Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π»ΠΎΠΆΠ΅Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π²ΠΈΠ΄Π°:

// 1 1 1

// 1 1 1

// 1 1 1

for (i = 1; i < (picture.Width — 1); i++)

{

for (j = 1; j < (picture.Height — 1); j++)

{

count = 0;

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½ΠΈ всСх пиксСлСй для красного Π² ΠΎΠΊΠ½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

for (k = -1; k <= 1; k++)

{

for (m = -1; m <= 1; m++)

{

if (m == 0 && k == 0)

{

continue;

}

R[count] = picture. GetPixel (i + k, j + m).R;

G[count] = picture. GetPixel (i + k, j + m).G;

B[count] = picture. GetPixel (i + k, j + m).B;

count++;

}

}

progressBar1.PerformStep ();

//Находим ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡƒΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ C#

minR = R. Min (); maxR = R. Max ();

minG = G. Min (); maxG = G. Max ();

minB = B. Min (); maxB = B. Max ();

//Находим срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ максимумом ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠΌ

sR = (maxR + minR) / 2;

sG = (maxG + minG) / 2;

sB = (maxB + minB) / 2;

//ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ срСдниС значСния Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² ΠΎΠΊΠ½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

picture.SetPixel (i, j, Color. FromArgb (sR, sG, sB));

}

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

private void trackBar1_MouseUp (object sender, MouseEventArgs e)

{

int bright = trackBar1. Value — 50;

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int r, g, b;

for (int i = 0; i < picture. Width — 1; i++)

{

for (int j = 0; j < picture. Height — 1; j++)

{

r = picture. GetPixel (i, j).R;

g = picture. GetPixel (i, j).G;

b = picture. GetPixel (i, j).B;

r += bright;

g += bright;

b += bright;

r = CorrectColor®;

b = CorrectColor (b);

g = CorrectColor (g);

picture.SetPixel (i, j, Color. FromArgb (r, g, b));

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

}

private void Π²Ρ‹Ρ…ΠΎΠ΄ToolStripMenuItem_Click (object sender, EventArgs e)

{

}

private void trackBar2_MouseUp (object sender, MouseEventArgs e)

{

double K;

K = Convert. ToDouble (trackBar2.Value) / Convert. ToDouble (50);

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int AveR = 0, AveG = 0, AveB = 0;

int r, g, b;

for (int i = 0; i < picture. Width — 1; i++)

{

for (int j = 0; j < picture. Height — 1; j++)

{

AveR = AveR + picture. GetPixel (i, j).R;

AveG = AveG + picture. GetPixel (i, j).G;

AveB = AveB + picture. GetPixel (i, j).B;

}

}

AveR = AveR / (picture.Width * picture. Height);

AveG = AveG / (picture.Width * picture. Height);

AveB = AveB / (picture.Width * picture. Height);

for (int i = 0; i < picture. Width; i++)

{

for (int j = 0; j < picture. Height; j++)

{

r = picture. GetPixel (i, j).R;

g = picture. GetPixel (i, j).G;

b = picture. GetPixel (i, j).B;

r = (int)((r — AveR) * K) + AveR;

g = (int)((g — AveG) * K) + AveG;

b = (int)((b — AveB) * K) + AveB;

r = CorrectColor®;

g = CorrectColor (g);

b = CorrectColor (b);

picture.SetPixel (i, j, Color. FromArgb (r, g, b));

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

}

private void trackBar1_Scroll (object sender, EventArgs e)

{

label1.Text = «Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ» + «(«+ Convert. ToString (trackBar1.Value — 50) + «)» + «:» ;

label1.Refresh ();

}

private void trackBar2_Scroll (object sender, EventArgs e)

{

label2.Text = «ΠšΠΎΠ½Ρ‚раст» + «(«+ Convert. ToString (Convert.ToDouble (trackBar2.Value) / Convert. ToDouble (50)) + «)» + «:» ;

label2.Refresh ();

}

private void ΠΌΠ΅Π΄ΠΈΠ°Π½Π½Ρ‹ΠΉΠ€ΠΈΠ»ΡŒΡ‚Ρ€ToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, j, k, m, count;

int[] R, G, B;

R = new int[9];

G = new int[9];

B = new int[9];

//ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° для этого Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄:

// 1 1 1

// 1 1 1

// 1 1 1

progressBar1.Value = 1;

progressBar1.Step = 1;

progressBar1.Maximum = picture. Width * picture. Height;

for (i = 1; i < (picture.Width — 1); i++)

{

//ВначалСдвигаСмсявправо

for (j = 1; j < (picture.Height — 1); j++)

{

count = 0;

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½ΠΈ всСх пиксСлСй для красного Π² ΠΎΠΊΠ½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

for (k = -1; k <= 1; k++)

{

for (m = -1; m <= 1; m++)

{

R[count] = picture. GetPixel (i + k, j + m).R;

G[count] = picture. GetPixel (i + k, j + m).G;

B[count] = picture. GetPixel (i + k, j + m).B;

count++;

}

}

progressBar1.PerformStep ();

//Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ массивы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ C#

Array.Sort®;

Array.Sort (G);

Array.Sort (B);

//ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΌΠ΅Π΄ΠΈΠ°Π½Π½Ρ‹ΠΉ элСмСнт Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² ΠΎΠΊΠ½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

picture.SetPixel (i, j, Color. FromArgb (R[4], G[4], B[4]));

}

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

int SumMod8(int x, int y)

{

int summ =0;

summ= x + y;

while (summ >7)

{

summ= summ -8;

}

return summ;

}

private void ΠΌΠ΅Ρ‚ΠΎΠ΄ΠšΠΈΡ€ΡˆΠ°ToolStripMenuItem_Click (object sender, EventArgs e)

{

Bitmap picture = new Bitmap (pictureBox1.BackgroundImage);

int i, j, g;

double[] S, T, A;

S =new double[8];

T =new double[8];

A =new double[8];

double max, mod;

progressBar1.Value = 1;

progressBar1.Step = 1;

progressBar1.Maximum = picture. Width * picture. Height;

for (i =1; i < (picture.Width -1); i++)

{

for (j =1; j < (picture.Height -1); j++)

{

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½ΠΈ яркости ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля Π² ΠΎΠΊΠ½Π΅ 3Ρ…3

// A0 A1 A2

// A7 F' A3

// A6 A5 A4

A[0] =0.3* picture. GetPixel (i -1, j -1).R +0.59* picture. GetPixel (i -1, j -1).G +0.11* picture. GetPixel (i -1, j -1).B;

A[1] =0.3* picture. GetPixel (i, j -1).R +0.59* picture. GetPixel (i, j -1).G +0.11* picture. GetPixel (i, j -1).B;

A[2] =0.3* picture. GetPixel (i +1, j -1).R +0.59* picture. GetPixel (i +1, j -1).G +0.11* picture. GetPixel (i +1, j -1).B;

A[3] =0.3* picture. GetPixel (i +1, j).R +0.59* picture. GetPixel (i +1, j).G +0.11* picture. GetPixel (i +1, j).B;

A[4] =0.3* picture. GetPixel (i +1, j +1).R +0.59* picture. GetPixel (i +1, j +1).G +0.11* picture. GetPixel (i +1, j +1).B;

A[5] =0.3* picture. GetPixel (i, j +1).R +0.59* picture. GetPixel (i, j +1).G +0.11* picture. GetPixel (i, j +1).B;

A[6] =0.3* picture. GetPixel (i -1, j +1).R +0.59* picture. GetPixel (i -1, j +1).G +0.11* picture. GetPixel (i -1, j +1).B;

A[7] =0.3* picture. GetPixel (i -1, j).R +0.59* picture. GetPixel (i -1, j).G +0.11* picture. GetPixel (i -1, j).B;

for (g =0; g <8; g++)

{

//Находим сумму Si

S[g] = A[g] +A[SumMod8(g, 1)] + A[SumMod8(g, 2)];

//Находимсумму Ti

T[g] = A[SumMod8(g, 3)] + A[SumMod8(g, 4)] + A[SumMod8(g, 5)] + A[SumMod8(g, 6)] + A[SumMod8(g, 7)];

}

max=0;

for (g =0; g <8; g++)

{

//РасчитываСмзначСниС |5*Si-3*Ti|

mod=Math.Abs ((5* S[g]) — (3* T[g]));

//Находим максимум ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ

if (mod > max)

{

max = mod;

}

}

//Для обСспСчСния Π±ΠΎΠ»Π΅Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° 100

max = max +100;

//ВыполняСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΡŽ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… 0…255

if (max >255)

{

max=255;

}

else if (max <0)

{

max =0;

}

progressBar1.PerformStep ();

//ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠ°Π½Π°Π»ΠΎΠ² R, G, B Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ F'

picture.SetPixel (i, j, Color. FromArgb ((int)max, (int)max, (int)max));

}

}

pictureBox1.BackgroundImage = picture;

pictureBox1.Refresh ();

}

private void ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒToolStripMenuItem_Click (object sender, EventArgs e)

{

LoadImage (true);

label1.Text = «Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ:» ;

label2.Text = «ΠšΠΎΠ½Ρ‚раст:» ;

trackBar1.Enabled = true;

trackBar1.Value = 50;

trackBar2.Enabled = true;

trackBar2.Value = 50;

}

}

}

Листинг класса DopForm. cs:

using System;

using System.Collections.Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System.Windows.Forms;

using Microsoft.Office.Interop;

using Excel = Microsoft.Office.Interop.Excel;

namespace Kursach

{

public partial class DopForm: Form

{

Bitmap bitmap1, bitmap2, bitmap3, bitmap4;

Graphics graphics1, graphics2, graphics3, graphics4;

double[] dop = new double[256];

int FLAG=0;

string name, filename;

public DopForm ()

{

InitializeComponent ();

}

private void refr1()

{

pictureBox1.Image = bitmap1;

}

private void refr2()

{

pictureBox2.Image = bitmap2;

}

private void refr3()

{

pictureBox3.Image = bitmap3;

}

private void refr4()

{

pictureBox4.Image = bitmap4;

}

private void DopForm_Load (object sender, EventArgs e)

{

bitmap1 = new Bitmap (pictureBox1.Width, pictureBox1. Height);

graphics1 = Graphics. FromImage (bitmap1);

bitmap2 = new Bitmap (pictureBox2.Width, pictureBox2. Height);

graphics2 = Graphics. FromImage (bitmap2);

bitmap3 = new Bitmap (pictureBox3.Width, pictureBox3. Height);

graphics3 = Graphics. FromImage (bitmap3);

bitmap4 = new Bitmap (pictureBox4.Width, pictureBox4. Height);

graphics4 = Graphics. FromImage (bitmap4);

refr1(); refr2(); refr3(); refr4();

}

public void Save_data (int opr)

{

int i, j;

Excel.Application oXL;

Excel.Workbook oWB;

Excel.Worksheet oSheet;

progressBar1.Minimum = 1;

progressBar1.Value = 1;

progressBar1.Step = 1;

DataGridView dv = new DataGridView ();

if (opr == 1)

dv = dataGridView1;

else if (opr == 2)

dv = dataGridView2;

else if (opr == 3)

dv = dataGridView3;

else

dv = dataGridView4;

progressBar1.Maximum = dv. RowCount * dv. ColumnCount;

try

{

oXL = new Excel. Application ();

oWB = (Excel.Workbook)oXL.Workbooks.Add (Type.Missing);

//oSheet = (Excel.Worksheet)oXL.Worksheets.Add (Type.Missing);

oSheet = (Excel.Worksheet)oWB.ActiveSheet;

for (i = 0; i < dv. ColumnCount — 1; i++)

oSheet.Cells[1, i+1] = i;

for (i = 0; i < dv. RowCount — 1; i++)

{

for (j = 0; j < dv. ColumnCount — 1; j++)

{

oSheet.Cells[i + 2, j+1] = dv. Rows[i]. Cells[j].Value;

progressBar1.PerformStep ();

}

}

oXL.Visible = true;

oXL.UserControl = true;

}

catch (Exception theException)

{

String errorMessage;

errorMessage = «Error: «;

errorMessage = String. Concat (errorMessage, theException. Message);

errorMessage = String. Concat (errorMessage, «Line: «);

errorMessage = String. Concat (errorMessage, theException. Source);

MessageBox.Show (errorMessage, «Error»);

}

}

private void Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒToolStripMenuItem_Click (object sender, EventArgs e)

{

Hide ();

}

private void ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ1ToolStripMenuItem_Click (object sender, EventArgs e)

{

Save_data (1);

}

private void ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ2ToolStripMenuItem1_Click (object sender, EventArgs e)

{

Save_data (2);

}

private void ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ3ToolStripMenuItem1_Click (object sender, EventArgs e)

{

Save_data (3);

}

private void ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ4ToolStripMenuItem1_Click (object sender, EventArgs e)

{

Save_data (4);

}

private void histogramm (int hist)

{

int i, j;

int zn, dl;

double dop_max;

double my;

Graphics gr;

Bitmap bp;

DataGridView dg;

if (hist == 1)

{

gr = graphics1;

//graphics1.Clear (Color.Transparent);

//graphics2.Clear (Color.Transparent);

//graphics3.Clear (Color.Transparent);

//graphics4.Clear (Color.Transparent);

bp = bitmap1;

dg = dataGridView1;

}

else if (hist == 2)

{

gr = graphics2;

//graphics2.Clear (Color.Transparent);

//graphics1.Clear (Color.Transparent);

bp = bitmap2;

dg = dataGridView2;

}

else if (hist == 3)

{

gr = graphics3;

//graphics3.Clear (Color.Transparent);

bp = bitmap3;

dg = dataGridView3;

}

else

{

gr = graphics4;

//graphics4.Clear (Color.Transparent);

bp = bitmap4;

dg = dataGridView4;

}

gr.DrawLine (new Pen (Color.Black), 5, 5, 5, bp. Height — 5);

gr.DrawLine (new Pen (Color.Black), 0, bp. Height — 15, bp. Width — 5, bp. Height — 15);

gr.DrawLine (new Pen (Color.Black), (bp.Width — 10) / 5 + 5, bp. Height — 17, (bp.Width — 10) / 5 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 2 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 2 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 3 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 3 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 4 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 4 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 5 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 5 + 5, bp. Height — 13);

gr.DrawString («50», new Font («Arial», 8), new SolidBrush (Color.Red), (bp.Width — 10) / 5 — 5, bp. Height — 15);

gr.DrawString («100», new Font («Arial», 8), new SolidBrush (Color.Red), ((bp.Width — 10) / 5) * 2 — 7, bp. Height — 15);

gr.DrawString («150», new Font («Arial», 8), new SolidBrush (Color.Red), ((bp.Width — 10) / 5) * 3 — 5, bp. Height — 15);

gr.DrawString («200», new Font («Arial», 8), new SolidBrush (Color.Red), ((bp.Width — 10) / 5) * 4 — 7, bp. Height — 15);

gr.DrawString («255», new Font («Arial», 8), new SolidBrush (Color.Red), ((bp.Width — 10) / 5) * 5 — 5, bp. Height — 15);

for (i = 0; i < dg. RowCount — 1; i++)

{

for (j = 0; j < dg. ColumnCount — 2; j++)

{

zn = (int)dg.Rows[i]. Cells[j + 1]. Value;

dop[zn]++;

}

}

dop_max = dop[0];

for (i = 1; i < 256; i++)

if (dop[i] > dop_max)

dop_max = dop[i];

my = Convert. ToDouble (bp.Height — 20) / Convert. ToDouble (dop_max);

for (i = 0; i < 255; i++)

{

dl = Convert. ToInt32(dop[i] * my);

//graphics1.DrawLine (new Pen (Color.Blue), 6 + i, bp. Height — 15, 6 + i, bp. Height — 15 — dl);

gr.DrawLine (new Pen (Color.Blue), 6 + i, bp. Height — 15, 6 + i, bp. Height — 15 — dl);

}

}

public void построСниСToolStripMenuItem_Click (object sender, EventArgs e)

{

FLAG = 0;

int k;

tabControl1.SelectedIndex = 1;

graphics1.Clear (Color.Transparent);

graphics2.Clear (Color.Transparent);

graphics3.Clear (Color.Transparent);

graphics4.Clear (Color.Transparent);

if (label10.Text == «1»)

{

histogramm (1);

refr1();

}

else

{

for (k = 1; k < 5;k++)

histogramm (k);

refr1();

refr2();

refr3();

refr4();

}

}

private void ogibayushaya (int ogib)

{

FLAG = 1;

int i, j, z;

int zn;

double my, dop_max;

Graphics gr;

Bitmap bp;

DataGridView dg;

if (ogib == 1)

{

gr = graphics1;

graphics1.Clear (Color.Transparent);

graphics2.Clear (Color.Transparent);

graphics3.Clear (Color.Transparent);

graphics4.Clear (Color.Transparent);

bp = bitmap1;

dg = dataGridView1;

}

else if (ogib == 2)

{

gr = graphics2;

graphics2.Clear (Color.Transparent);

graphics1.Clear (Color.Transparent);

bp = bitmap2;

dg = dataGridView2;

}

else if (ogib == 3)

{

gr = graphics3;

graphics3.Clear (Color.Transparent);

bp = bitmap3;

dg = dataGridView3;

}

else

{

gr = graphics4;

graphics4.Clear (Color.Transparent);

bp = bitmap4;

dg = dataGridView4;

}

gr.DrawLine (new Pen (Color.Black), 5, 5, 5, bp. Height — 5);

gr.DrawLine (new Pen (Color.Black), 0, bp. Height — 15, bp. Width — 5, bp. Height — 15);

gr.DrawLine (new Pen (Color.Black), (bp.Width — 10) / 5 + 5, bp. Height — 17, (bp.Width — 10) / 5 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 2 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 2 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 3 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 3 + 5, bp. Height — 13);

gr.DrawLine (new Pen (Color.Black), ((bp.Width — 10) / 5) * 4 + 5, bp. Height — 17, ((bp.Width — 10) / 5) * 4 + 5, bp. Height — 13);

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ