Dönme açısı denir. Profile göre tasarım

Bir taramalı görüntüyü, görüntünün geometrik merkezine göre 90°'nin katları olan açılarda döndürmek önemsiz bir iştir ve her pikselin koordinatlarının basitçe dönüştürülmesiyle kalite kaybı olmadan çözülebilir.

Aşağıda, bir raster görüntünün minimum kayıpla rastgele bir merkeze göre rastgele bir açıyla hassas bir şekilde döndürülmesi için bir algoritmayı ele alacağız.

Sağlanan yardım için Vladislav Vladimirovich Kharchenko'ya şükranlarımı sunuyorum.

Algoritma

Yukarıdaki şekilden, taramalı görüntüyü döndürdükten sonra, son görüntünün her pikselinin renginin, orijinal görüntünün birkaç pikselinin birkaç "parçasının" renklerinin karşılık gelen alanlarla orantılı olarak eklenmesiyle belirlendiği görülebilir. "parça". Dolayısıyla genel anlamda problemimizin çözümü, orijinal görüntünün her pikseli için tüm "parçaların" alanlarını bulmak ve son görüntünün her pikselinin rengini karşılık gelen "parçaların" renklerinden toplamak olacaktır.

Orijinal görüntünün piksel modeli olarak kenar = 1 olan bir kare kullanacağız ve köşeler için aşağıdaki gösterimleri kullanacağız:
i1 - en sağ köşe;
i2 - en alt köşe;
i3 - en sol köşe;
i4 en üst köşedir.

Nihai görüntü modeli, çizgiler arasındaki mesafe = 1 olan paralel yatay ve dikey çizgilerden oluşan bir ızgara olacaktır.

Bu gösterimde taramalı görüntünün dönme merkezinin koordinatları, bir çift rastgele gerçek sayı olarak ifade edilebilir. Yani bizim problemimizde dönme merkezi pikselin geometrik merkezinde veya ızgara çizgilerinin kesişme noktasında değil, Kartezyen koordinatlarda keyfi bir noktada olabilir.

Raster görüntü döndürüldüğünde, her pikselin karesi aynı açıyla (o pikselin merkezine göre) döndürüldüğü için, sorunu bir piksel için çözeceğiz ve sonra ortaya çıkan çözümü orijinalin her pikseline uygulayacağız. görüntü.

Bir bitmap'i döndürmek iki bölüme ayrılabilir:
1. Orijinal görüntünün her pikselinin karesini, bu karenin merkezine göre belirli bir açıyla döndürün.
2. Piksel karesinin merkezinin, görüntünün dönme merkezine göre görüntünün dönme açısına göre yer değiştirmesi, böylece kare, son görüntünün ızgarası üzerinde son konumunu alır.
Bu durumda, son görüntünün ızgarası, orijinal görüntünün her pikselinin karesini 4, 5 veya 6 parça miktarında "parçalara" keser.

Ortaya çıkan seçeneklerin çeşitliliğini sistematik hale getirmek için, orijinal görüntünün piksel karesinin son görüntünün ızgarasıyla olası tüm kesişme noktalarından oluşan bir sınıflandırma oluşturmam gerekiyordu. Önemli ölçüde farklı olan yalnızca 23 seçenek vardı:


Buradaki sözleşmeler aşağıdaki gibidir:
- hücrelerdeki sayılar, görüntü döndürüldükten sonra son görüntü ızgarasının belirli bir hücresine düşen piksel karesinin köşelerinin sayısını gösterir;
- yeşil renk, pikselin bazı kısımlarının düştüğü ve orada bir "kıymık" bırakmasının garanti edildiği hücreleri gösterir;
- sarı, koşullara bağlı olarak hangi hücreleri gösterir? olabilmek karenin köşeleri tarafından değil, karenin kenarları tarafından oluşturulan bir piksel karesinin "parçalarına" çarpabilir (veya çarpmayabilir).

Açıklık sağlamak için, 3 numaralı seçeneğin olası varyasyonlarından birini vereceğim:

Gördüğünüz gibi, sağ üst hücre, diğer döndürme koşulları altında içerebilmesine rağmen, bir pikselin "parçasını" içermiyor.
Okuyucuyu ayrıntılı geometrik hesaplamalarla boğmamak için, bu 23 seçeneğin hepsinde orijinal görüntünün pikselinin, alanı 4 formülün birleştirilmesiyle kolayca hesaplanan "parçalara" bölündüğünü hemen söyleyeceğim. . Aşağıda bu formülleri resimli olarak bulabilirsiniz. Kırmızı renk, son görüntünün piksel karesini kesen ızgara çizgilerini gösterir. Formülle alanı hesaplanan alan sarı renkle gölgelenmiştir.

Formül 1
Bu formül, "parçanın" son alanını hesaplamak için kullanılmaz, ancak tüm pikselin alanının = 1 olduğunu bildiğimiz için yardımcı ara alanların hızlı bir şekilde hesaplanması için kullanılması uygundur.
Karenin köşelerinden nihai görüntünün ızgarasına bırakılan yükseklikler, tüm formüllerde girdi değişkenleri olarak kullanılır, bunun basit nedeni, bu yüksekliklerin hesaplanmasının, koordinatın sayısal değerinin kesirli kısmının anında seçilmesine indirgenmesidir. piksel karesinin karşılık gelen köşesinin.

Formül 2

Bu formül yalnızca 1. ve 2. seçenekte kullanılır.

Formül 3
Sık kullanılan bir formül - iyi tarafı hızlı bir şekilde hesaplanmasıdır. Dönme açısı her piksel için aynı olduğundan, tüm pikseller işlenmeden önce tüm trigonometrik fonksiyonlar bir kez hesaplanabilir ve daha sonra bu değerler döngüde sabit olarak kullanılabilir.

Formül 4
Bu formül iki adımda hesaplanır. Öncelikle parantez içindeki ifade değerlendirilir. Pozitif bir değer alırsa alan hesaplanır. Değerin negatif olması, gridin köşesi ile karenin kenarının oluşturduğu “kıymık”ın pikselden kesilmediği anlamına gelir ve daha fazla hesaplama yapmanın bir anlamı yoktur.

Yukarıdakilerin tümü dikkate alındığında genel olarak algoritma şöyle görünecektir:
1. Orijinal görüntüyü bilgisayar belleğine yükleyin.
2. Son görüntünün boyutlarını piksel cinsinden hesaplayın.
3. Her bir öğesi kayan noktalı sayı formatında 3 RGB renk bileşeni içeren iki boyutlu bir ara dizi oluşturun. Dizinin boyutları son görüntünün boyutlarına eşittir.
4. Kaynak görüntünün tüm piksellerini sırayla yineleyin; her birini belirli bir açıyla döndürüyoruz ve piksel karesinin köşelerinin 4 koordinatını hesaplayarak son görüntünün ızgarasına yerleştiriyoruz; pikseli 23 seçeneğe sınıflandırıyoruz ve “parçaların” alanlarını sayıyoruz; Ortaya çıkan "parçaların" renklerini, bu "parçaların" alanıyla orantılı olarak ara dizinin karşılık gelen öğelerine ekliyoruz.
5. Orijinal görüntünün tüm piksellerini işledikten sonra ara dizideki RGB değerlerini her eleman için bir tamsayı değerine yuvarlıyoruz ve bu tamsayı değerlerine göre BMP formatında son görüntüyü oluşturuyoruz.

programı

Yukarıdaki algoritmaya dayanarak Windows için bir program yazıldı. Object Pascal'ın kaynak kodları ve derlenmiş yürütülebilir dosya indirilebilir.

Programın arayüzü.
“Aç...” düğmesine tıklamak, bir BMP dosya seçimi iletişim kutusunu açar. Yalnızca 24 bit paletli bitmapler desteklenir. Açık görüntü bir pencerede görüntülenir. Pencere başlığı dosyanın tam yolunu ve görüntü boyutlarını görüntüler.

"Açı" alanında, dönüş açısını derece cinsinden (herhangi bir pozitif sayı) belirtin.
Kesirli sayıları girerken ondalık ayırıcı olarak nokta veya virgül kullanılabilir.

“CW” ve “CCW” radyo düğmeleri dönüş yönünü ayarlar: sırasıyla “saat yönünde” ve “saat yönünün tersine”.

“Arka plan rengi” bloğunda görüntünün kenarlık piksellerinin karıştırılacağı arka plan rengini ayarlayabilirsiniz. Varsayılan arka plan rengi siyahtır.

“Merkez X” ve “Merkez Y” alanlarında dönme merkezinin koordinatları belirtilir. Koordinatların orijininin görüntünün sol üst köşesinde olduğu ve Y'nin aşağıya doğru arttığı dikkate alınmalıdır. Varsayılan olarak döndürme merkezi, yüklenen görüntünün geometrik merkezine ayarlanır.

“Döndür” düğmesine tıklandığında veya Enter tuşuna basıldığında görüntü, belirtilen dönme merkezine göre belirli bir açı kadar döndürülür ve pencerede görüntülenir. Görüntünün 90°'nin katları olan açılarda döndürülmesi, basitleştirilmiş bir şemaya göre, orijinal görüntünün piksel koordinatlarının basitçe dönüştürülmesiyle gerçekleştirilir ve "Merkez X" ve "Merkez Y" değerleri göz ardı edilir.
Algoritmanın saniye cinsinden çalışma süresi “Döndür” butonunun altında görüntülenir.

“Kaydet…” düğmesini kullanarak döndürülen görüntü bir BMP dosyasına kaydedilebilir.

Nihai görüntü pencereye sığmazsa, StretchBlt API işlevi kullanılarak pencere kenarlarına ayarlanır; bu nedenle, büyük görüntülerin gerçek kalitesi yalnızca kaydedilen BMP dosyası kullanılarak değerlendirilebilir.
Bir görüntüyü farklı bir açıya döndürmek için yeniden yüklemenize gerek yoktur; pencerede o anda görüntülenen görüntü değil, seçilen dosyadaki görüntü döndürülür.

Dört çekirdekli 2,67 GHz işlemciye sahip bir makinede 1024 x 768 boyutlarındaki bir görüntü, bu program tarafından ortalama olarak yaklaşık 0,5 saniyede istenilen bir açıya döndürülür. 4000 x 4000 boyutlarında bir görüntü - yaklaşık 10 saniyede. Algoritmanın farklı açılar için çalışma süresi, farklı açılardaki görüntünün farklı sayıda "parçaya" bölünmesi nedeniyle farklılık gösterebilir, bu parçaların alanlarının hesaplanması için harcanan toplam süre de buna göre farklıdır.

Kayan nokta formatındaki son görüntü piksellerinin rengi hakkında bilgi içeren ara dizi, genişletilmiş türde (10 bayt) uygulanır, bu nedenle büyük görüntülerin işlenmesi (yaklaşık 5000 x 5000 pikselden fazla) bellek taşması hatasına neden olabilir. Daha az kesin bir veri türü kullanarak ve sayının tamsayı kısmını doğrudan son bitmap'e kaydederek, yardımcı dizide yalnızca kesirli kısmı bırakarak durumu iyileştirmek mümkündür.

sonuçlar

Photoshop'ta uygulanan hassas algoritmanın ve görüntü döndürme algoritmasının çalışmasının karşılaştırmalı bir analizini yapalım.
Test 1
İlk test için çok basit bir görüntü aldım - 1 piksel kalınlığında ve 10 piksel uzunluğunda yatay siyah bir çizgi, 100 x 100 piksel boyutlarında beyaz bir karenin merkezinden kaydırılmış:

Daha sonra bu görüntüyü koordinatları (0, 0) olan noktaya göre saat yönünde 3° döndürdüm. (0, 0) noktası seçildi çünkü deneylerime göre Photoshop görüntüyü bu noktaya göre döndürüyor. İşte karşılaştırmalı sonuç (24x yakınlaştırılmış):

Hassas algoritma

Photoshop7.0.1

Photoshop CS6 (64 Bit)
Photoshop algoritması daha kontrastlı bir görüntü üretirken, hassas algoritma görüntüyü bir miktar "bulanıklaştırır". Ancak genel olarak görsel bir değerlendirmeyle sonuç neredeyse aynıdır. Bu arada Photoshop'ta uygulanan döndürme algoritmasının 10 yılda önemli bir değişikliğe uğramadığını belirtelim.

Test 2
İkinci test için standart Win7 dağıtımından Tulip'i seçtim:

Bu görüntüyü geometrik merkeze göre saat yönünde 5° döndürdükten sonra tüm piksellerin rengini RGB kanalları cinsinden topladım. İşte hassas algoritma ve Photoshop algoritmasının sonucu:
Parantez içindeki sayılar bu göstergenin orijinalinden mutlak sapmasını göstermektedir.
Hassas döndürmeden sonra ve yuvarlamadan önce görüntünün rengi pratikte değişmedi; bu beklenen bir şeydi.
Bu özel durumda en büyük sapmayı Photoshop algoritmasının G kanalında buluyoruz. Yüzde cinsinden bu sapma yalnızca %0,06'dır, dolayısıyla "gözle" farkedilemez, ancak mükemmeliyetçilik nedeniyle Photoshop'un sonucu hassas bir algoritmanınkinden daha kötüdür.
Hassasiyet algoritmasındaki her pikselin renginin BMP formatının gerektirdiği tamsayı değerine yuvarlanmasının renk bilgilerinin bir kısmını geri dönülemez biçimde yok ettiğini unutmamak önemlidir.

İki algoritmanın görsel bir karşılaştırması için görüntünün büyütülmüş bir parçasını vereceğim,

Sırasıyla saat yönünde 5° döndürülmüş, Photoshop:

Ve hassas bir algoritmayla:

Karşılaştırmalı analiz, Photoshop'un görüntünün zıt öğelerini korumada daha iyi olduğunu, ancak aynı zamanda çarpık renk "haloları" yaratmada daha iyi olduğunu gösteriyor. Hassasiyet algoritması rengi bozmaz ancak aynı zamanda görüntüyü bir miktar "bulanıklaştırır".

sonuçlar

1. Raster görüntünün hassas ve aynı zamanda nispeten hızlı bir şekilde isteğe bağlı bir açıyla döndürülmesi mümkündür. Profesyonel grafik editörlerinin, kullanıcının bir görüntüyü biraz daha kısa sürede son derece hassas bir şekilde döndürmesine olanak tanıyan bir seçeneğe neden sahip olmadığı benim için bir sır olarak kalıyor.

2. Dikkate alınan algoritmanın aşırı doğruluğuna rağmen, ters görüntü dönüşümü, yani. Kaliteyi kaybetmeden ters açıya döndürmek imkansızdır çünkü tam renk değerinin yuvarlanması (kayan nokta formatında) renk bilgilerinin bir kısmını geri dönülemez biçimde yok eder.

3. Kontrastlı detayların görsel algısı açısından en iyi sonuç, optimal olmayan Photoshop algoritması ile elde edilir. Görüntünün rengiyle ilgili maksimum bilgiyi korumanın önemli olduğu durumlarda hassas bir algoritma kullanmak mantıklıdır.

Güncelleme: Pratik kullanım için, son görüntünün her pikseli için orijinal görüntüdeki gerekli tüm piksel parçalarının sırayla hesaplandığı ve renk yuvarlamanın hemen gerçekleştiği basitleştirilmiş bir algoritma uygulayan bir program yazdım. Ancak bundan sonra son görüntünün bir sonraki pikseli hesaplanır. Bu durumda program, kaynak görüntünün tek bir pikseline birkaç kez erişir. Böylece hesaplama süresi ortalama 1,7 kat arttı, ancak algoritmanın bu sürümündeki bellek yalnızca büyük boyutlu görüntülerle çalışmanıza olanak tanıyan bitmaplerin depolanmasına harcanıyor. Programı ve kaynakları indirebilirsiniz


Trigonometride önemli bir kavram dönme açısı. Aşağıda sürekli olarak dönüş hakkında bir fikir vereceğiz ve ilgili tüm kavramları tanıtacağız. Genel bir dönüş fikriyle başlayalım, örneğin tam bir dönüş. Şimdi dönme açısı kavramına geçelim ve dönmenin yönü ve büyüklüğü gibi temel özelliklerini ele alalım. Son olarak bir şeklin bir nokta etrafında dönmesinin tanımını veriyoruz. Metindeki teorinin tamamını açıklayıcı örnekler ve grafik resimlerle sunacağız.

Sayfada gezinme.

Bir noktanın bir nokta etrafında dönmesine ne denir?

Hemen belirtelim ki, “bir nokta etrafında dönme” tabirinin yanı sıra aynı anlama gelen “bir nokta etrafında dönme” ve “bir nokta etrafında dönme” tabirlerini de kullanacağız.

Hadi tanıştıralım bir noktayı bir nokta etrafında döndürme kavramı.

Öncelikle dönme merkezini tanımlayalım.

Tanım.

Döndürmenin yapıldığı noktaya denir dönme merkezi.

Şimdi noktanın döndürülmesi sonucunda ne olacağını söyleyelim.

Belirli bir A noktasının O dönme merkezine göre döndürülmesi sonucunda, bir A 1 noktası elde edilir (belirli bir sayı durumunda A ile çakışabilir) ve A 1 noktası bir dairenin üzerinde yer alır. OA yarıçapının O noktasında merkez. Başka bir deyişle, O noktasına göre döndürüldüğünde A noktası, merkezi OA yarıçaplı O noktasında bulunan bir daire üzerinde bulunan A1 noktasına gider.

O noktasının kendi etrafında dönerken kendine döndüğüne inanılıyor. Yani O dönme merkezi etrafında dönme sonucunda O noktası kendine döner.

A noktasının O noktası etrafındaki dönüşünün, A noktasının OA yarıçaplı O noktasında merkezi olan bir daire içindeki hareketinin bir sonucu olarak bir yer değiştirme olarak kabul edilmesi gerektiğini de belirtmekte fayda var.

Açıklık sağlamak için, A noktasının O noktası etrafında dönüşünün bir örneğini vereceğiz; aşağıdaki şekillerde A noktasının A 1 noktasına hareketini bir ok kullanarak göstereceğiz.

Tam dönüş

A noktasını O dönme merkezine göre döndürmek mümkündür, böylece A noktası dairenin tüm noktalarını geçtikten sonra aynı yerde olacaktır. Bu durumda A noktasının O noktası etrafında hareket ettiğini söylüyorlar.

Tam bir devrimin grafiksel bir resmini verelim.

Bir devirde durmazsanız ve noktayı daire etrafında hareket ettirmeye devam ederseniz, o zaman iki, üç vb. tam devir gerçekleştirebilirsiniz. Aşağıdaki çizimde sağa iki tam dönüşün ve sola üç dönüşün nasıl yapılabileceği gösterilmektedir.


Dönme açısı kavramı

İlk paragrafta tanıtılan bir noktayı döndürme kavramından, A noktasının O noktası etrafında döndürülmesi için sonsuz sayıda seçeneğin olduğu açıktır. Aslında, merkezi O noktası olan ve yarıçapı OA olan bir daire üzerindeki herhangi bir nokta, A noktasının döndürülmesi sonucu elde edilen A 1 noktası olarak düşünülebilir. Bu nedenle, bir dönüşü diğerinden ayırmak için tanıtıyoruz dönme açısı kavramı.

Dönme açısının özelliklerinden biri dönüş yönü. Dönme yönü, noktanın saat yönünde mi yoksa saat yönünün tersine mi döndürüleceğini belirler.

Dönme açısının bir diğer özelliği de büyüklük. Dönme açıları aynı birimlerle ölçülür: derece ve radyan en yaygın olanlardır. Burada, dönme açısının, derece cinsinden değeri pozitif olan ve 180'i aşmayan geometrideki açının aksine, eksi sonsuzdan artı sonsuza kadar herhangi bir gerçek sayı ile derece cinsinden ifade edilebileceğini belirtmekte fayda var.

Dönme açılarını belirtmek için genellikle Yunan alfabesinin küçük harfleri kullanılır: vb. Çok sayıda dönme açısını belirtmek için genellikle alt simge içeren bir harf kullanılır, örneğin: .

Şimdi dönme açısının özelliklerinden daha detaylı ve sırayla bahsedelim.

Dönüş yönü

Merkezi O noktası olan bir çember üzerinde A ve A1 noktaları işaretlensin. A noktasından A 1 noktasına, O merkezi etrafında saat yönünde veya saat yönünün tersine dönerek ulaşabilirsiniz. Bu dönüşleri farklı düşünmek mantıklıdır.

Olumlu ve olumsuz yöndeki dönüşleri örnekleyelim. Aşağıdaki çizim solda pozitif yönde, sağda negatif yönde dönüşü göstermektedir.

Dönme açısı değeri, isteğe bağlı değerin açısı

Dönme merkezi dışındaki bir noktanın dönme açısı tamamen büyüklüğünün belirtilmesiyle belirlenir; öte yandan, dönme açısının büyüklüğüne göre bu dönmenin nasıl gerçekleştirildiğine karar verilebilir.

Yukarıda da belirttiğimiz gibi derece cinsinden dönme açısı −∞'dan +∞'a kadar bir sayı ile ifade edilir. Bu durumda artı işareti saat yönünde dönüşe, eksi işareti ise saat yönünün tersine dönüşe karşılık gelir.

Şimdi dönüş açısının değeri ile karşılık geldiği dönüş arasında bir yazışma kurmaya devam ediyor.

Sıfır derecelik bir dönüş açısıyla başlayalım. Bu dönme açısı A noktasının kendisine doğru hareketine karşılık gelir. Yani O noktası etrafında 0 derece döndürüldüğünde A noktası yerinde kalır.

A noktasının, dönüşün yarım devir içinde gerçekleştiği O noktası etrafında dönmesine devam ediyoruz. A noktasının A 1 noktasına gittiğini varsayacağız. Bu durumda AOA 1 açısının derece cinsinden mutlak değeri 180'i geçmez. Dönme pozitif yönde meydana gelmişse, dönme açısının değeri AOA 1 açısının değerine eşit kabul edilir ve dönme negatif yönde meydana gelmişse, değeri açının değerine eşit kabul edilir. Eksi işaretiyle AOA 1. Örnek olarak burada 30, 180 ve −150 derecelik dönüş açılarını gösteren bir resim bulunmaktadır.


180 dereceden büyük ve -180 dereceden küçük dönme açıları, aşağıdaki oldukça açık olana göre belirlenir: ardışık dönüşlerin özellikleri: A noktasının O merkezi etrafındaki birkaç ardışık dönüşü, büyüklüğü bu dönmelerin büyüklüklerinin toplamına eşit olan bir dönüşe eşdeğerdir.

Bu özelliği gösteren bir örnek verelim. A noktasını O noktasına göre 45 derece döndürelim, sonra bu noktayı 60 derece döndürelim, ardından bu noktayı -35 derece döndürelim. Bu dönüşlerdeki ara noktaları A 1, A 2 ve A 3 olarak gösterelim. A noktasının 45+60+(−35)=70 derece açıyla bir kez döndürülmesiyle aynı A 3 noktasına ulaşabiliriz.

Dolayısıyla, 180 dereceden büyük dönüş açılarını, birbirini izleyen birkaç açı dönüşü olarak temsil edeceğiz; bunların toplamı, orijinal dönüş açısının değerini verir. Örneğin, 279 derecelik bir dönüş açısı, 180 ve 99 derecelik veya 90, 90, 90 ve 9 derecelik veya 180, 180 ve −81 derecelik ardışık dönüşlere veya 1 derecelik 279 ardışık dönüşe karşılık gelir.

-180 dereceden küçük dönme açıları da benzer şekilde belirlenir. Örneğin, -520 derecelik bir dönüş açısı, noktanın ardışık olarak -180, -180 ve -160 derece dönmesi olarak yorumlanabilir.

Özetle. Değeri −∞ ila +∞ aralığındaki bazı gerçek sayılarla derece cinsinden ifade edilen dönme açısını belirledik. Trigonometride, özellikle dönme açılarıyla çalışacağız, ancak "dönme" kelimesi sıklıkla atlanıyor ve sadece "açı" deniyor. Bu nedenle trigonometride, dönme açılarını kast ettiğimiz keyfi büyüklükteki açılarla çalışacağız.

Bu noktayı sonuçlandırmak için, pozitif yönde tam bir dönüşün 360 derecelik (veya 2 π radyan) bir dönüş açısına ve negatif yönde ise −360 derecelik (veya −2 π rad) bir dönüş açısına karşılık geldiğini not ediyoruz. . Bu durumda, büyük dönüş açılarını belirli sayıda tam dönüş ve başka bir dönüş olarak -180 ila 180 derece arasında değişen bir açıyla temsil etmek uygundur. Örneğin 1.340 derecelik bir dönüş açısını ele alalım. 1.340'ı 360·4+(−100) olarak hayal etmek kolaydır. Yani, ilk dönüş açısı pozitif yönde 4 tam dönüşe ve ardından -100 derecelik bir dönüşe karşılık gelir. Başka bir örnek: −745 derecelik bir dönüş açısı, saat yönünün tersine iki dönüş ve ardından −25 derecelik bir dönüş olarak yorumlanabilir, çünkü −745=(−360) 2+(−25) .

Şekli bir nokta etrafında belirli bir açıyla döndürme

Nokta döndürme kavramı kolaylıkla genişletilebilir. herhangi bir şekli bir nokta etrafında belirli bir açıyla döndürme(Öyle bir dönüşten bahsediyoruz ki hem etrafında dönüş yapılan nokta hem de döndürülen şekil aynı düzlemde yer alıyor).

Bir şeklin döndürülmesiyle, şeklin tüm noktalarının belirli bir nokta etrafında belirli bir açıyla dönmesini kastediyoruz.

Örnek olarak, aşağıdaki eylemi açıklayalım: AB parçasını O noktasına göre bir açı kadar döndürün; bu parça döndürüldüğünde A 1 B 1 parçasına dönüşecektir.

Kaynakça.

  • Cebir: Ders Kitabı 9. sınıf için. ortalama okul / Yu. N. Makarychev, N. G. Mindyuk, K. I. Neshkov, S. B. Suvorova; Ed. S. A. Telyakovsky.- M.: Eğitim, 1990.- 272 s.: ill.- isbn 5-09-002727-7
  • Bashmakov M.I. Cebir ve analizin başlangıcı: Ders kitabı. 10-11 sınıflar için. ortalama okul - 3. baskı. - M.: Eğitim, 1993. - 351 s.: hasta. - ISBN 5-09-004617-4.
  • Cebir ve analizin başlangıcı: Proc. 10-11 sınıflar için. Genel Eğitim kurumlar / A.N. Kolmogorov, A.M. Abramov, Yu.P. Dudnitsyn ve diğerleri; Ed. A. N. Kolmogorov - 14. baskı - M.: Eğitim, 2004. - 384 s.: - ISBN 5-09-013651-3.
  • Gusev V.A., Mordkovich A.G. Matematik (teknik okullara girenler için bir el kitabı): Proc. ödenek.- M.; Daha yüksek okul, 1984.-351 s., hasta.

GİRİİŞ. SORUNUN FORMÜLASYONU.

1. GÖRÜNTÜ DÖNDÜRME ALGORİTMASININ AÇIKLAMASI

2. C# PROGRAMLAMA DİLİNDE UYGULAMA GELİŞTİRME

2.1 Uygulamanın açıklaması

2.2 Uygulamanın test edilmesi

ÇÖZÜM

KULLANILAN KAYNAKLARIN LİSTESİ

EK A

GİRİİŞ. SORUNUN FORMÜLASYONU

"Görüntü elde etme ve işleme" disiplini çalışmasının bir parçası olarak, bir test olarak görev, algoritmayı tanımlamak ve görüntüyü kullanıcı tarafından belirlenen bir açıyla merkez etrafında döndürme işlevini uygulamak için belirlendi. Bir açının kosinüsünü ve sinüsünü bir kez hesaplayın. Tüm başlangıç ​​parametrelerini isteğe göre ayarlayın ve kabul edilebilir değerler aralığına uygunluğu kontrol edin.

1 . Görüntü döndürme algoritmasının açıklaması

Bir görüntüyü derece cinsinden belirtilen bir açıyla döndürmek için özel Bitmap RotateImage(Bitmap Image, int angle) işlevini kullanın.

Giriş parametreleri:

Bitmap Görüntüsü - döndürülecek görüntü;

int angle - derece cinsinden dönüş açısı.

İşlev, belirli bir açıyla döndürülmüş bir görüntüyü döndürür.

Fonksiyonun algoritması:

1) Giriş, görüntü ve derece cinsinden dönüş açısıdır;

2) Dönme açısının sinüsünü ve kosinüsünü hesaplayın (bir kez). Dönme açısı radyan cinsinden belirtilir;

3) Döndürme açısının hesaplanan sinüs ve kosinüsünü kullanarak görüntünün yeni genişliğini ve yüksekliğini hesaplayın;

4) Bir paralelkenarı tanımlayan bir dizi Nokta atış galerisi yapısının başlatılması (Nokta noktaları = yeni Nokta).

5) Dönme açısına (radyan cinsinden hangi çeyrekte yer aldığına) bağlı olarak, yeni bir görüntü oluşturmak için üç noktanın koordinatları hesaplanır. Koordinatlar bu algoritmanın (3) noktasına göre hesaplanır (yeni genişlik ve yükseklik - noktaların X ve Y koordinatlarının yeniden hesaplanması);

6) Döndürülmüş görüntünün üç noktayı kullanarak çizilmesi (paralelkenarın sol üst, sağ üst ve sol alt köşeleri. Dördüncü nokta, ilk üçe göre tahmin edilir).

g.DrawImage(Görüntü, noktalar); - çizim işlevi.

7) Döndürülmüş görüntüyü bu işlevin dışında kullanmak üzere döndürün.

Görüntüyü ortalamak, pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage öğe özelliği tarafından gerçekleştirilir;

2 . C# PROGRAMLAMA DİLİNDE UYGULAMA GELİŞTİRME

Görüntü işleme uygulamasının geliştirme aracı olarak MS Visual Studio 2012, programlama dili olarak ise C# seçilmiştir. Bu araç seti, grafiklerle çalışmak için yeterli sayıda yetenek sağlar.

Göreve uygun bir uygulama geliştirildi.

2. 1 Uygulama Açıklaması

görüntü açısı aralığını döndür

Uygulama frmRotationForm sınıfını temel alır.

Bu sınıf aşağıdaki yöntemleri uygular:

Özel void btnRotateImage_Click(object sender, EventArgs e) yöntemi, "görüntüyü döndür" düğmesine tıklamayı yönetir. Tıklamanın ardından, metin alanının içeriği bir sayıya dönüştürülmeye çalışılır (daha sonra dönme açısını derece cinsinden depolamak üzere tasarlanmış olan ang değişkeni olarak kullanılmak üzere). Bu yöntem aynı zamanda istisnaları da ele alır ve görüntüyü döndüren RotateImage işlevini başlatır.

Özel Bitmap RotateImage(Bitmap Image, int angle) yöntemi, görüntüyü belirli bir açıyla döndürür. Döndürülmüş bir görüntü döndürür.

Özel void btnLoadImage_Click(object sender, EventArgs e) yöntemi, diskteki bir görüntüyü orijinal görüntüyle birlikte PictureBox'a yükler.

Özel void timer1_Tick(object sender, EventArgs e) yöntemi her zamanlayıcı işareti için yürütülür. Bu uygulamada frekans 50 milisaniyeye ayarlanmıştır (animasyon modunda daha düzgün çalışma için).

2. 2 Uygulama testi

Geliştirilen uygulama Microsoft Windows 7 64-bit işletim sisteminde .NET Framework 4.5 kurulu olarak test edilmiştir. Yürütülebilir dosya Image_Rotation.exe'nin başlatılmasının sonucu Şekil 2.1'de gösterilmektedir.

Şekil 2.1 - Başlangıçtaki uygulama penceresi

Uygulamayı başlattığımda seçtiğim varsayılan görüntü “kablolu”. “Resim yükle” butonuna tıklayarak değiştirebilirsiniz. Kendi görselinizi seçmenin sonucu Şekil 2.2'de sunulmaktadır.

Şekil 2.2 - Döndürme için kendi görselinizi seçme

Diğer eylemler varsayılan görüntüde tartışılmaktadır. Formun sol üst köşesindeki ilgili metin alanında döndürme açısını seçtikten sonra “resmi döndür” butonuna tıklayın. (bkz. Şekil 2.3).

Şekil 2.3 - Görüntünün 8 derece döndürülmesinin sonucu

Şekilde açıklanan dikdörtgenler yardımcı bir araçtır, size kolaylık sağlamak için görüntülenirler ve görüntünün merkezini gösterirler.

Uygulama "aptal koruma" uygular, yani: metnin yanı sıra 360 dereceden büyük veya -360 dereceden az bir açı girmeye çalışırsanız, bir uyarı görüntülenir ve resim işlenmez:

Şekil 2.4 - Görüntüyü -361 derece döndürme girişimi

Uygulama, saat yönünde/saat yönünün tersine "animasyonlu döndürme" ve ayrıca "yakınlaştırma" (resmi PictureBox kabına sığacak şekilde büyütme) olanağını uygular.

Şekil 2.5 - Animasyonlu döndürme

ÇÖZÜM

Test için teknik özelliklerde belirlenen göreve ulaşıldı.

C# programlama dilini kullanarak görüntü işleme teknikleri üzerine eğitim aldım.

Uygulamanın kaynak kodu Ek A'da sunulmaktadır.

KULLANILAN KAYNAKLARIN LİSTESİ

1 Starovoytov V.V. Dijital görüntüler: edinimden

işleme / V.V. Starovoitov, Yu.I. Golub - Minsk: Belarus'un OIPI NAS'ı, 2014. - 202 s. - ISBN 978-985-6744-80-1.

2 Christian Nagel, Bill Ivien ve diğerleri. Profesyoneller için C# 2008 ve .NET 3.5 platformu - Profesyonel C# 2008. - M.: Dialectics, 2008. - ISBN 978-5-8459-1458-3.

3 Microsoft platformunda uygulama geliştirme. MSDN [Elektronik kaynak]: http://msdn.microsoft.com/ru-ru/library/4f9s3at1(v=vs.110).aspx. - Erişim tarihi: 25.10.2014.

EK A

"frmRotationForm" sınıfının listesi

System.Collections.Generic'i kullanarak;

System.ComponentModel'i kullanarak;

System.Data'yı kullanarak;

System.Drawing'i kullanarak;

System.Linq'i kullanarak;

System.Text'i kullanarak;

System.Threading.Tasks'ı kullanma;

System.Windows.Forms'u kullanarak;

System.Drawing.Drawing2D kullanarak;

ad alanı Image_Rotation

genel kısmi sınıf frmRotationForm: Form

Private int jj;//derece cinsinden açı

public frmRotationForm()

Bileşeni Başlatma();

w.Text = pictureBox3.Image.Width.ToString();

h.Text = pictureBox3.Image.Height.ToString();

jj = Convert.ToInt32(textBox1.Text);

özel void btnRotateImage_Click(nesne göndereni, EventArgs e)

ang = Convert.ToInt32(textBox1.Text);

eğer (ang)< -360 || ang > 360)

yakalama (Örneğin istisna)

Mesaj Kutusu.Show("0'dan 360'a kadar açılara izin verilir. \n\"-\" işaretinin saat yönünün tersine dönmesine izin verilir.");

Bitmap i = new Bitmap(pictureBox1.Image);

pictureBox1.Image = this.RotateImage(i, ang);

//this.Controls.Add(pictureBox1);

özel Bitmap RotateImage(Bitmap Görüntüsü, int açı)

var pi2 = Math.PI/2;//PI ikişer ikişer

int eskiGenişlik = Resim.Genişlik;

int eskiYükseklik = Resim.Yükseklik;

var theta = açı * Math.PI / 180.0 //radyana dönüştürün;

var kilitli_theta = theta;

if (kilitli_theta< 0.0) locked_theta += 2 * Math.PI;

çift ​​yeniGenişlik, yeniYükseklik;

int nGenişlik, nYükseklik;

çift ​​bitişikÜst, karşıtÜst;

çift ​​bitişikAlt, karşıAlt;

#region Yeni genişlik ve yüksekliği hesapla

double SİNUS = Math.Abs(Math.Sin(locked_theta));

double COSINUS = Math.Abs(Math.Cos(locked_theta));

if ((locked_theta >= 0.0 && kilitli_theta< pi2) || (locked_theta >= Math.PI && kilitli_theta< (Math.PI + pi2)))

(// Açı (>= 0 ve< Pi/2) или (>= PI ve< ПИ + Пи/2)

bitişikTop = COSİNUS * eskiGenişlik;

karşıTop = SİNÜS * eskiGenişlik;

bitişikAlt = COSİNUS * eskiYükseklik;

karşıAlt = SİNÜS * eskiYükseklik;

bitişikÜst = SİNÜS * eskiYükseklik;

karşıTop = COSİNUS * eskiYükseklik;

bitişikAlt = SİNÜS * eskiGenişlik;

karşıAlt = COSİNÜS * eskiGenişlik;

yeniGenişlik = bitişikÜst + karşıAlt;

yeniYükseklik = bitişikAlt + karşıtÜst;

nWidth = (int)(Math.Ceiling(newWidth));//tamsayılara yuvarlama

nHeigth = (int)(Math.Ceiling(newHeigth));

#endregion Yeni genişlik ve yüksekliği hesapla

Bitmap dönüşümlüBmp = new Bitmap(nWidth,nHeigth);

Grafik g = Graphics.FromImage(rotatedBmp);

Nokta noktaları = yeni Nokta ;//paralelkenarı tanımlayan 3 Nokta tipi yapılardan oluşan bir dizi

//Üç nokta şunu temsil eder: paralelkenarın sol üst, sağ üst ve sol alt köşeleri.

//Dördüncü nokta ilk üçten çıkarılmıştır

//referans noktası (0,0) - sol üst köşe

if (locked_theta >= 0.0 && kilitli_theta< pi2) //90

puan = new Point((int)oppositeBottom, 0);

else if (locked_theta >= pi2 && kilitli_theta< Math.PI) //90-180

puan = new Nokta(nWidth, (int)(oppositeTop));

else if (locked_theta >= Math.PI && kilitli_theta< (Math.PI + pi2))//180-270

puan = new Nokta((int)(adjacentTop), nHeigth);

puan = new Nokta(0, (int)(adjacentBottom));

puan = new Nokta(nWidth, (int)(oppositeTop));

puan = new Nokta(0, (int)(adjacentBottom));

puan = new Nokta((int)(oppositeBottom), 0);

puan = new Nokta((int)(adjacentTop), nHeigth);

label6.Text = "Merkez ORİJİNAL x="+ (oldWidth / 2.0f).ToString() + ", y=" + (oldHeigth / 2.0f).ToString();

label7.Text = "Merkez ROTATE x=" + (nWidth / 2.0f).ToString() + ", y=" + (nHeigth / 2.0f).ToString();

g.DrawImage(Görüntü, noktalar);

g.DrawRectangle(new Pen(Color.Red, 0.1f),new Rectangle(0,0,nWidth/2,nHeigth/2));

g.DrawRectangle(new Pen(Color.Red, 0,1f), new Rectangle(nWidth/2, nHeigth/2, nWidth/2-1, nHeigth/2-1));

Image.Dispose();

döndürülmüşBmp'yi döndür;

özel void btnLoadImage_Click(nesne göndereni, EventArgs e)

OpenFileDialog dlg = new OpenFileDialog();

dlg.Title = "Resmi Aç";!}

dlg.Filter = "jpg dosyaları (*.jpg)|*.jpg|Tüm dosyalar (*.*)|*.*";

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

pictureBox3.Image = yeni Bitmap(dlg.OpenFile());

resimKutusu1.Resim = resimKutusu3.Resim;

w.Text = pictureBox1.Image.Width.ToString();

h.Text = pictureBox1.Image.Height.ToString();

özel void timer1_Tick(nesne göndereni, EventArgs e)

if (checkBox2.Checked)

(//pkcherbox modunu ZOOM olarak değiştirin

PictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

//işaretlenmezse görüntü ortalanır

pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

if (checkBox1.Checked)

(//“animasyon”un uygulanması - resmin kendi ekseni etrafında saat yönünde/saat yönünün tersine döndürülmesi

radyoButton1.Visible = doğru;

radyoButton2.Visible = doğru;

if (radioButton1.Checked)

( //saat yönünde

this.textBox1.Text = jj++.ToString();

if (jj == 360) jj = 0;

(//saat yönünün tersine

this.btnRotateImage_Click(bu, e);

this.textBox1.Text = jj--.ToString();

eğer (jj == 0) jj = 359;

radyoButton1.Visible = false;

radyoButton2.Visible = yanlış;

Benzer belgeler

    Görüntü gürültü filtreleme. İkilileştirilmesi ve döndürülmesi için algoritmalar. Not tanıma için bilgilendirici özelliklerin oluşturulması. Yazılım diyagramı. Programda uygulanan sınıfların, işlevlerin, yöntemlerin açıklaması. Uygulama testi.

    kurs çalışması, 17.12.2013 eklendi

    Grafik formatları hakkında bilgi. Programda bir görüntünün saklanması. Yardımcı veri yapısı olarak kuyruk. İkili dosyadan bir görüntü yükleniyor. Görüntülerle işlemler. Çözünürlükte azalma. Görüntü boyutunu artırın.

    kurs çalışması, 29.06.2013 eklendi

    Uluslararası JPEG standardını kullanarak yarı tonlu bir görüntüyü sıkıştırmak veya sıkıştırmak için tasarlanmış bir programın geliştirilmesi. JPEG yönteminin açıklaması, sonuçların kodu çözülmüş bir görüntü biçiminde çıktısı. Yarı tonlu görüntü sıkıştırma yöntemlerinin gözden geçirilmesi.

    kurs çalışması, eklendi: 10/14/2012

    İki görüntüyü karşılaştırmak için genel algoritma. Maksimum alan yöntemi. Histogram yöntemi. Tanıma için bir resim hazırlanıyor. Çok değişkenli bir fonksiyonun modellenmesi. Vektör dağıtımı. Deforme olabilen modeller. Yazılım uygulaması.

    tez, 29.09.2008 eklendi

    Adobe Photoshop CS6'da "Winnie the Pooh" çizgi film karakterinin animasyonlu GIF görüntüsünü oluşturma aşamalarının açıklaması. Yinelenen bir görüntü katmanı oluşturma ve GIF animasyonu için çerçeveler hazırlama. Animasyon efektlerini ve sonuç GIF dosyasını özelleştirin.

    laboratuvar çalışması, eklendi 03/05/2015

    Amacı siyah beyaz yarı tonlu görüntüleri renkli görüntülere dönüştürmek olan bir uygulamanın geliştirilmesi. Görüntü işleme tekniklerinin gözden geçirilmesi, sinir ağı kullanılarak görüntü dönüştürme yöntemleri. Renk alanı kümelemesinin açıklamaları.

    tez, 17.06.2012 eklendi

    Dönme hareketi sırasında hareket parametrelerinin belirlenmesi, hızın, ivmenin, zamanın dönme açısına bağımlılığı, dönme süresinin belirli bir açıya ayarlanması. Oluşturulan matematiksel modelin vücut hareket parametrelerinin hesaplanmasına uygulanması.

    kurs çalışması, eklendi 03/18/2010

    Bilgisayar grafikleri. Piksel, çözünürlük, görüntü boyutu. Görüntü türleri. Siyah beyaz çizgi ve yarı tonlu görüntüler. İndekslenmiş renkler. Tam renkli görüntüler. Dosya formatları. Renk ve modelleri. Renk modelleri: RGB, CMYK, HSB.

    özet, 20.02.2009 eklendi

    Görüntü kodlama yöntemleri: sayı uzunluğu kodlaması, frekansa bağlı kodlama, Lempel-Ziv yöntemi. 16 bit renkte çizgi boyutu. Orijinal görüntünün tamamının boyutunu hesaplayın. Yüksek kaliteli ve düşük kaliteli görüntü sıkıştırma örnekleri.

    sunum, 22.10.2013 eklendi

    Adobe Photoshop program arayüzü. Görüntüde değişiklik yapma. Renk tonunu değiştirmeye ve görüntüleri bozmaya yönelik araçlar. Görüntü oluşum sırası. Görüntülerin ton ve renk düzeltmesi, filtreler ve işlevlerle çalışma.

Bir taramalı görüntüyü, görüntünün geometrik merkezine göre 90°'nin katları olan açılarda döndürmek önemsiz bir iştir ve her pikselin koordinatlarının basitçe dönüştürülmesiyle kalite kaybı olmadan çözülebilir.

Aşağıda, bir raster görüntünün minimum kayıpla rastgele bir merkeze göre rastgele bir açıyla hassas bir şekilde döndürülmesi için bir algoritmayı ele alacağız.

Sağlanan yardım için Vladislav Vladimirovich Kharchenko'ya şükranlarımı sunuyorum.

Algoritma

Yukarıdaki şekilden, taramalı görüntüyü döndürdükten sonra, son görüntünün her pikselinin renginin, orijinal görüntünün birkaç pikselinin birkaç "parçasının" renklerinin karşılık gelen alanlarla orantılı olarak eklenmesiyle belirlendiği görülebilir. "parça". Dolayısıyla genel anlamda problemimizin çözümü, orijinal görüntünün her pikseli için tüm "parçaların" alanlarını bulmak ve son görüntünün her pikselinin rengini karşılık gelen "parçaların" renklerinden toplamak olacaktır.

Orijinal görüntünün piksel modeli olarak kenar = 1 olan bir kare kullanacağız ve köşeler için aşağıdaki gösterimleri kullanacağız:
i1 - en sağ köşe;
i2 - en alt köşe;
i3 - en sol köşe;
i4 en üst köşedir.

Nihai görüntü modeli, çizgiler arasındaki mesafe = 1 olan paralel yatay ve dikey çizgilerden oluşan bir ızgara olacaktır.

Bu gösterimde taramalı görüntünün dönme merkezinin koordinatları, bir çift rastgele gerçek sayı olarak ifade edilebilir. Yani bizim problemimizde dönme merkezi pikselin geometrik merkezinde veya ızgara çizgilerinin kesişme noktasında değil, Kartezyen koordinatlarda keyfi bir noktada olabilir.

Raster görüntü döndürüldüğünde, her pikselin karesi aynı açıyla (o pikselin merkezine göre) döndürüldüğü için, sorunu bir piksel için çözeceğiz ve sonra ortaya çıkan çözümü orijinalin her pikseline uygulayacağız. görüntü.

Bir bitmap'i döndürmek iki bölüme ayrılabilir:
1. Orijinal görüntünün her pikselinin karesini, bu karenin merkezine göre belirli bir açıyla döndürün.
2. Piksel karesinin merkezinin, görüntünün dönme merkezine göre görüntünün dönme açısına göre yer değiştirmesi, böylece kare, son görüntünün ızgarası üzerinde son konumunu alır.
Bu durumda, son görüntünün ızgarası, orijinal görüntünün her pikselinin karesini 4, 5 veya 6 parça miktarında "parçalara" keser.

Ortaya çıkan seçeneklerin çeşitliliğini sistematik hale getirmek için, orijinal görüntünün piksel karesinin son görüntünün ızgarasıyla olası tüm kesişme noktalarından oluşan bir sınıflandırma oluşturmam gerekiyordu. Önemli ölçüde farklı olan yalnızca 23 seçenek vardı:



Buradaki sözleşmeler aşağıdaki gibidir:
- hücrelerdeki sayılar, görüntü döndürüldükten sonra son görüntü ızgarasının belirli bir hücresine düşen piksel karesinin köşelerinin sayısını gösterir;
- yeşil renk, pikselin bazı kısımlarının düştüğü ve orada bir "kıymık" bırakmasının garanti edildiği hücreleri gösterir;
- sarı, koşullara bağlı olarak hangi hücreleri gösterir? olabilmek karenin köşeleri tarafından değil, karenin kenarları tarafından oluşturulan bir piksel karesinin "parçalarına" çarpabilir (veya çarpmayabilir).

Açıklık sağlamak için, 3 numaralı seçeneğin olası varyasyonlarından birini vereceğim:

Gördüğünüz gibi, sağ üst hücre, diğer döndürme koşulları altında içerebilmesine rağmen, bir pikselin "parçasını" içermiyor.
Okuyucuyu ayrıntılı geometrik hesaplamalarla boğmamak için, bu 23 seçeneğin hepsinde orijinal görüntünün pikselinin, alanı 4 formülün birleştirilmesiyle kolayca hesaplanan "parçalara" bölündüğünü hemen söyleyeceğim. . Aşağıda bu formülleri resimli olarak bulabilirsiniz. Kırmızı renk, son görüntünün piksel karesini kesen ızgara çizgilerini gösterir. Formülle alanı hesaplanan alan sarı renkle gölgelenmiştir.

Formül 1

Bu formül, "parçanın" son alanını hesaplamak için kullanılmaz, ancak tüm pikselin alanının = 1 olduğunu bildiğimiz için yardımcı ara alanların hızlı bir şekilde hesaplanması için kullanılması uygundur.
Karenin köşelerinden nihai görüntünün ızgarasına bırakılan yükseklikler, tüm formüllerde girdi değişkenleri olarak kullanılır, bunun basit nedeni, bu yüksekliklerin hesaplanmasının, koordinatın sayısal değerinin kesirli kısmının anında seçilmesine indirgenmesidir. piksel karesinin karşılık gelen köşesinin.

Formül 2


Bu formül yalnızca 1. ve 2. seçenekte kullanılır.

Formül 3

Sık kullanılan bir formül - iyi tarafı hızlı bir şekilde hesaplanmasıdır. Dönme açısı her piksel için aynı olduğundan, tüm pikseller işlenmeden önce tüm trigonometrik fonksiyonlar bir kez hesaplanabilir ve daha sonra bu değerler döngüde sabit olarak kullanılabilir.

Formül 4

Bu formül iki adımda hesaplanır. Öncelikle parantez içindeki ifade değerlendirilir. Pozitif bir değer alırsa alan hesaplanır. Değerin negatif olması, gridin köşesi ile karenin kenarının oluşturduğu “kıymık”ın pikselden kesilmediği anlamına gelir ve daha fazla hesaplama yapmanın bir anlamı yoktur.

Yukarıdakilerin tümü dikkate alındığında genel olarak algoritma şöyle görünecektir:
1. Orijinal görüntüyü bilgisayar belleğine yükleyin.
2. Son görüntünün boyutlarını piksel cinsinden hesaplayın.
3. Her bir öğesi kayan noktalı sayı formatında 3 RGB renk bileşeni içeren iki boyutlu bir ara dizi oluşturun. Dizinin boyutları son görüntünün boyutlarına eşittir.
4. Kaynak görüntünün tüm piksellerini sırayla yineleyin; her birini belirli bir açıyla döndürüyoruz ve piksel karesinin köşelerinin 4 koordinatını hesaplayarak son görüntünün ızgarasına yerleştiriyoruz; pikseli 23 seçeneğe sınıflandırıyoruz ve “parçaların” alanlarını sayıyoruz; Ortaya çıkan "parçaların" renklerini, bu "parçaların" alanıyla orantılı olarak ara dizinin karşılık gelen öğelerine ekliyoruz.
5. Orijinal görüntünün tüm piksellerini işledikten sonra ara dizideki RGB değerlerini her eleman için bir tamsayı değerine yuvarlıyoruz ve bu tamsayı değerlerine göre BMP formatında son görüntüyü oluşturuyoruz.

programı

Yukarıdaki algoritmaya dayanarak Windows için bir program yazıldı. Object Pascal'ın kaynak kodları ve derlenmiş yürütülebilir dosya indirilebilir.

Programın arayüzü.
“Aç...” düğmesine tıklamak, bir BMP dosya seçimi iletişim kutusunu açar. Yalnızca 24 bit paletli bitmapler desteklenir. Açık görüntü bir pencerede görüntülenir. Pencere başlığı dosyanın tam yolunu ve görüntü boyutlarını görüntüler.

"Açı" alanında, dönüş açısını derece cinsinden (herhangi bir pozitif sayı) belirtin.
Kesirli sayıları girerken ondalık ayırıcı olarak nokta veya virgül kullanılabilir.

“CW” ve “CCW” radyo düğmeleri dönüş yönünü ayarlar: sırasıyla “saat yönünde” ve “saat yönünün tersine”.

“Arka plan rengi” bloğunda görüntünün kenarlık piksellerinin karıştırılacağı arka plan rengini ayarlayabilirsiniz. Varsayılan arka plan rengi siyahtır.

“Merkez X” ve “Merkez Y” alanlarında dönme merkezinin koordinatları belirtilir. Koordinatların orijininin görüntünün sol üst köşesinde olduğu ve Y'nin aşağıya doğru arttığı dikkate alınmalıdır. Varsayılan olarak döndürme merkezi, yüklenen görüntünün geometrik merkezine ayarlanır.

“Döndür” düğmesine tıklandığında veya Enter tuşuna basıldığında görüntü, belirtilen dönme merkezine göre belirli bir açı kadar döndürülür ve pencerede görüntülenir. Görüntünün 90°'nin katları olan açılarda döndürülmesi, basitleştirilmiş bir şemaya göre, orijinal görüntünün piksel koordinatlarının basitçe dönüştürülmesiyle gerçekleştirilir ve "Merkez X" ve "Merkez Y" değerleri göz ardı edilir.
Algoritmanın saniye cinsinden çalışma süresi “Döndür” butonunun altında görüntülenir.

“Kaydet…” düğmesini kullanarak döndürülen görüntü bir BMP dosyasına kaydedilebilir.

Nihai görüntü pencereye sığmazsa, StretchBlt API işlevi kullanılarak pencere kenarlarına ayarlanır; bu nedenle, büyük görüntülerin gerçek kalitesi yalnızca kaydedilen BMP dosyası kullanılarak değerlendirilebilir.
Bir görüntüyü farklı bir açıya döndürmek için yeniden yüklemenize gerek yoktur; pencerede o anda görüntülenen görüntü değil, seçilen dosyadaki görüntü döndürülür.

Dört çekirdekli 2,67 GHz işlemciye sahip bir makinede 1024 x 768 boyutlarındaki bir görüntü, bu program tarafından ortalama olarak yaklaşık 0,5 saniyede istenilen bir açıya döndürülür. 4000 x 4000 boyutlarında bir görüntü - yaklaşık 10 saniyede. Algoritmanın farklı açılar için çalışma süresi, farklı açılardaki görüntünün farklı sayıda "parçaya" bölünmesi nedeniyle farklılık gösterebilir, bu parçaların alanlarının hesaplanması için harcanan toplam süre de buna göre farklıdır.

Kayan nokta formatındaki son görüntü piksellerinin rengi hakkında bilgi içeren ara dizi, genişletilmiş türde (10 bayt) uygulanır, bu nedenle büyük görüntülerin işlenmesi (yaklaşık 5000 x 5000 pikselden fazla) bellek taşması hatasına neden olabilir. Daha az kesin bir veri türü kullanarak ve sayının tamsayı kısmını doğrudan son bitmap'e kaydederek, yardımcı dizide yalnızca kesirli kısmı bırakarak durumu iyileştirmek mümkündür.

sonuçlar

Photoshop'ta uygulanan hassas algoritmanın ve görüntü döndürme algoritmasının çalışmasının karşılaştırmalı bir analizini yapalım.

Test 1

İlk test için çok basit bir görüntü aldım - 1 piksel kalınlığında ve 10 piksel uzunluğunda yatay siyah bir çizgi, 100 x 100 piksel boyutlarında beyaz bir karenin merkezinden kaydırılmış:

Daha sonra bu görüntüyü geometrik merkeze göre saat yönünde 3° döndürdüm. İşte karşılaştırmalı sonuç (24x yakınlaştırılmış):

Hassas algoritma

Photoshop CS6 (64 Bit)
Açıkçası, Photoshop algoritması görüntüde belirli bozulmalara neden olur. Bu arada, Photoshop'ta uygulanan döndürme algoritmasının 10 yılda gözle görülür bir değişiklik geçirmediğini belirtelim.

Test 2

İkinci test için standart Win7 dağıtımından Tulip'i seçtim:

Bu görüntüyü geometrik merkeze göre saat yönünde 5° döndürdükten sonra tüm piksellerin rengini RGB kanalları cinsinden topladım. İşte hassas algoritma ve Photoshop algoritmasının sonucu:

Parantez içindeki sayılar bu göstergenin orijinalinden mutlak sapmasını göstermektedir.
Hassas döndürmeden sonra ve yuvarlamadan önce görüntünün rengi pratikte değişmedi; bu beklenen bir şeydi.
Bu özel durumda en büyük sapmayı Photoshop algoritmasının G kanalında buluyoruz. Yüzde cinsinden bu sapma yalnızca %0,06'dır, dolayısıyla "gözle" farkedilemez, ancak mükemmeliyetçilik nedeniyle Photoshop'un sonucu hassas bir algoritmanınkinden daha kötüdür.
Hassasiyet algoritmasındaki her pikselin renginin BMP formatının gerektirdiği tamsayı değerine yuvarlanmasının renk bilgilerinin bir kısmını geri dönülemez biçimde yok ettiğini unutmamak önemlidir.

İki algoritmanın görsel bir karşılaştırması için görüntünün büyütülmüş bir parçasını vereceğim,

sırasıyla saat yönünde 5° döndürüldü, Photoshop:

ve hassas bir algoritma:

Karşılaştırmalı analiz, Photoshop'un görüntünün zıt öğelerini korumada daha iyi olduğunu, ancak aynı zamanda çarpık renk "haloları" yaratmada daha iyi olduğunu gösteriyor. Hassasiyet algoritması rengi bozmaz ancak aynı zamanda görüntüyü bir miktar "bulanıklaştırır".

sonuçlar

1. Raster görüntünün hassas ve aynı zamanda nispeten hızlı bir şekilde isteğe bağlı bir açıyla döndürülmesi mümkündür. Profesyonel grafik editörlerinin, kullanıcının bir görüntüyü biraz daha kısa sürede son derece hassas bir şekilde döndürmesine olanak tanıyan bir seçeneğe neden sahip olmadığı benim için bir sır olarak kalıyor.

2. Dikkate alınan algoritmanın aşırı doğruluğuna rağmen, ters görüntü dönüşümü, yani. Kaliteyi kaybetmeden ters açıya döndürmek imkansızdır çünkü tam renk değerinin yuvarlanması (kayan nokta formatında) renk bilgilerinin bir kısmını geri dönülemez biçimde yok eder.

3. Zıt detayların görsel algısı açısından en iyi sonuç, optimal olmayan algoritma ile elde edilir. Görüntünün rengiyle ilgili maksimum bilgiyi korumanın önemli olduğu durumlarda hassas bir algoritma kullanmak mantıklıdır.



Makaleyi beğendin mi? Arkadaşlarınla ​​paylaş!