題:
旋轉是一種固有的有損操作嗎(對於角度不是90度的倍數)?
Alberto
2013-08-23 19:48:30 UTC
view on stackexchange narkive permalink

mattdm的陳述“ 如果您完全相反地進行相同的操作,模糊在很大程度上是可逆的”,這使我想到了一個問題。旋轉是圖像的幾何變換,包括坐標的空間變換和強度插值。如果旋轉不是90度的倍數,則插值算法起著至關重要的作用。

在這種情況下,如果我們使用平均插值算法(例如,雙三次),則操作是有損耗的 * sup>。但是我們可以改用其他方法(例如最近的Nightbor插值),使旋轉後的圖像“不旋轉”嗎?

(*)這只是我的感覺(我仍然無法支持它) (帶有數學證明):由於我們無法確定哪個像素貢獻了平均值,因此無法反轉平均值。但是我不確定我們不能使用概率方法來準確估計原始值。 sub>


雖然我缺乏必要的數學技能,但我自己還是做了一些測試(使用gimp ),但在防旋轉之後,圖像有所不同:

測試1

source image

圖1 b>-源圖像(256x256)

NN Rotated 9,5 degrees, rotated -9,5 degrees, difference

圖2 b>-從左到右:a)圖像順時針旋轉9.5度; b)圖像再次逆時針旋轉9.5度; c)圖像之間的差異。對於這些操作,我使用了最近的neightbor 插值法。操作後將圖像縮小以更好地適合此網站佈局。

bicubic Rotated 9,5 degrees, rotated -9,5 degrees, difference 圖3 b>-從左到右:a)圖像順時針旋轉9.5度; b)圖像再次逆時針旋轉9.5度; c)圖像之間的差異。對於這些操作,我使用了 bicubic 插值法。操作後將圖像縮小以更好地適合此網站佈局。

測試2

按照@unapiedra的建議,我做了一個更簡單的測試:旋轉2x2矩陣。這種情況沒有意義,因為取決於角度,所有單元都旋轉相同的角度,或者沒有單元旋轉。也就是說,旋轉始終是無損的。

所以我再次嘗試了3x3矩陣和30度旋轉:

rotating a 3x3 matrix without scaling

圖4 b>-從左到右:a)源圖像; b)圖像順時針旋轉30度; c)圖像逆時針旋轉30度; d)差異。圖像被放大以適合該網站。

在這種情況下,差異是顯而易見的。旋轉顯然是有損耗的...但是如果我在旋轉之前進行了放大,會發生什麼?

測試3

rotating a previously upscaled 3x3 matrix

圖5 -從左至右:a)源圖像; b)將圖像放大6倍; c)順時針旋轉30度的放大圖像; d)圖像逆時針旋轉30度; e)縮小的變換圖像; f)差異(無差異)。圖像被放大以適合該網站。

在這種情況下,我將圖像放大6倍。選擇此因素的原因(很不幸,如我在反例中看到的那樣):

旋轉30度的像素的坐標從左下到右上:[0,0]-[0.3660 ,1.3660]。即,最短的投影面具有0.36像素的長度。 採樣定理要求我們以兩倍的採樣率進行採樣。

因此,要精確採樣30度旋轉的圖像,我必須對每個0.17像素採樣,得出x5.88調整大小因子; 3 x 5.88 = 17,64,因此我將源圖像重新採樣為18x18圖像。

問題“ [Windows Photo Viewer旋轉是否無損嗎?](http://photo.stackexchange.com/questions/12361/are-windows-photo-viewer-rotations-lossless)”針對特定軟件解決了該主題,旋轉90度角的倍數。
五 答案:
Szabolcs
2013-08-23 23:50:35 UTC
view on stackexchange narkive permalink

圖像旋轉是一種有損操作,但是旋轉一次圖像然後再旋轉回去可能會損失很少的細節,尤其是與典型的JPEG壓縮相比。


圖像旋轉在數學上的工作方式如下:

灰度圖像由位於整數像素位置 x,y 的亮度值 L_(x,y)組成。首先構造一個實參函數 f(x,y),該函數以相同的 x,y code再現值 L_(x,y) >位置,但也會給出非整數 x,y 處的值。因此,它是在整數 x,y 個位置之間進行插值(這是插值方法的用處-- f(x,y)有多種可能的選擇)。

然後構造一個旋轉版本 g(x,y)= f(x cos(a)-y sin(a),x sin(a)+ y cos(a))按角度 a 。此操作在數學上是無損的,在有限精度計算機上執行計算時不會計算數值舍入誤差。

最後, g(x,y)值以整數 x,y 再次定位以創建圖像。


這時您可以問:為什麼有損?如果我們知道使用什麼插值方法構造 f ,我們是否不能僅僅顛倒所有這些計算以重建原始的未旋轉的 L_(x,y)

從理論上講是可行的,但是當您在相反方向上旋轉相同角度時,不會發生這種情況。與其精確地反轉原始旋轉操作,不如使用與初始旋轉相同的操作順序執行相反的符號旋轉。向後旋轉的圖像將與原始圖像不完全相同。

此外,如果 g(x,y)的值四捨五入到較低的精度(8-位0..255),信息丟失甚至更大。


許多累積的旋轉將有效地使圖像模糊。這是一個將500 x 500像素的Lena圖像旋轉12次30次,相當於完整360度旋轉的示例:

enter image description here


還有另一個原因模糊類型的操作將是有損的。可能會天真的認為數學上逆轉模糊應該可以使我們恢復原始的未模糊圖像。從理論上講,只要我們以無限的精度進行工作,這都是正確的。該過程稱為反捲積,實際上用於銳化由於運動模糊或光學原因而模糊的圖像。

但有一個陷阱:模糊對圖像不敏感源圖像中的細微變化。如果模糊兩個相似的圖像,您將獲得更多相似的結果。去模糊對微小的變化非常敏感:如果對兩個只有稍微不同的圖像進行去模糊,則會得到兩個非常不同的結果。通常,我們的工作精度不高(實際上8位精度很低),嘗試反轉模糊時舍入誤差會變大。

這就是模糊“不可逆”的原因,並且為什麼它會丟失細節。

為什麼要談論模糊?
@Michael這是為什麼這些操作類型不可逆的一個重要點,儘管從數學上看它們確實是可逆的。我的觀點是,這不僅與舍入錯誤有關,還與嘗試逆轉操作時這些錯誤經常被放大有關。
這也是由於圖像大小有限並且丟失了重要數據(在卷積情況下)
“與其精確地反轉原始旋轉操作,不如使用與初始旋轉相同的操作順序來執行相反的符號旋轉”-我認為這是我一直在尋找的答案。我尚未接受您的回答,因為我正在玩一些數學運算(試圖找到我在其他評論中提到的比例因子)。
我無處可去,放棄了數學推理。我接受您的回答,因為它是最詳細,最有說服力的答案。
Unapiedra
2013-08-23 20:38:47 UTC
view on stackexchange narkive permalink

在一般情況下旋轉並不是有損耗的,但是與圖像結合使用時卻是有損耗的。

原因是像素值合併在一起。如果旋轉圖像,則大多數像素的位置將與圖像的網格結構不完全匹配。現在需要進行插值,以決定將像素值放置在哪裡。

在最近鄰插值中,像素值將移動到最近的網格單元(像素位置)。

在雙三次插值中,像素值會影響附近的所有封閉網格單元,實質上,值會分佈到封閉像素上。

旋轉本身並不是有損的,但將像素的一個網格方向旋轉到另一方向是個好主意。儘管大多數人可能會從問題中推斷出這一點,但仍然值得強調。
您是否暗示大多數人不會閱讀第一句話? “ ...但與圖像結合使用,[有損]”。
szabolscs給出的更詳細的答案可能會被接受,並且更加具體。
在重新光柵化旋轉的圖像之前,不會發生實際的數據丟失。如果您的圖像編輯軟件在內部存儲了中間圖像和旋轉值,但僅對其進行了柵格化處理以在屏幕上顯示或以位圖格式顯式保存時,則可以進行第二次旋轉,其大小相同,但方向和方向相反撤消旋轉而不會丟失。 (注意,我不知道Photoshop / GIMP / etc項目如何存儲您的數據。)
@Unapiedra-不,我為您指出了+1。
@AJHenderson啊,很奇怪
@DanNeely當然是Lightroom的工作方式。舊的GIMP將其柵格化存儲。在帶有GEGL引擎的新GIMP上,實際上可能會這樣做。
感謝您的回答。對我來說,平均將分佈強度值。這就是為什麼我認為無損運算必然意味著採用非平均插值策略的原因。關於分箱,我的直覺仍然告訴我,適當的重新縮放應會有所幫助。
AJ Henderson
2013-08-23 20:14:24 UTC
view on stackexchange narkive permalink

如果您充分提高分辨率,我相信您應該能夠使其無損,但是我認為它必須更大一些。您將需要有效地“填充”足夠的像素,以便在反轉操作並將分辨率降低到原始值的捨入誤差下將誤差減小到。不過,此時,您最好將原始圖像存儲在圖像的隱藏層中,因為添加的數據點要比圖像副本要多得多。

實際上,要求是有損的,因為它是對值進行平均以創建新的點,並且通常需要更多的額外存儲空間以進行充分升級,而不是簡單地存儲另一個副本。

您的想法是正確的,但只能在有限的可能輪換中使用。想像一下,您將中間分辨率設置為獲得3.22度的無損旋轉。現在,旋轉3.23,您的結果將顯示損失。總的來說,這是成立的,因為存在無限多個旋轉,但像素始終有限。
@Unapiedra-是的,老實說,我剛想到,至少在某些其他情況下,應該可以通過增加分辨率然後在回滾後減小分辨率來保留信息,但是無論哪種方式,由於由於數量太多,這是不切實際的需要存儲的其他信息,我不願意進一步證明它,因為從實際意義上講,沒有理由要這樣做,而不是除了旋轉的圖像外,還存儲未旋轉的圖像。
“如果您充分提高分辨率[],這正是我的直覺:應該為給定角度找到一個縮放係數,以使我們能夠進行“旋轉和防旋轉”無損操作。但是如何計算這個因子呢?我完全同意以下觀點:“沒有理由……”,但我現在正在研究這個主題,這個問題更多是一個理論性的問題(根據“在醫療應用中,是否可以無損旋轉進一步改造它的圖片等等')
我的直覺告訴我,如果我以兩倍的分辨率重新採樣源圖像,則旋轉可能會無損([採樣定理](http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem) )最短的像素邊緣投影。例如,對於問題的9.5°旋轉,坐標從左上到右下[0,0]-[1,1]的旋轉像素將具有坐標[0,0]-[0.82,1.15 ]。即,最短邊緣投影的長度為0.82像素。每0.41像素重新採樣就足夠了。也就是說,放大倍數為x2.43即可。
不幸的是,我已經在GIMP中對其進行了測試,儘管我得到了更好的結果,但是操作仍然不是無損的:-(
@Unapiedra“您的想法是正確的” ...用什麼術語?根據您的評論,我知道可以根據旋轉角度來計算方便的中間分辨率嗎?我已經嘗試過,但是正如前面的評論所承認的那樣,沒有任何結果。
@Alberto我建議您嘗試使用2x2像素的圖像和一些奇角(15.3deg)和高畫質,直到找到解決方案。您也可以從理論上解決它(我認為),但是我沒有時間。
@Unapiedra好的建議。我已經對其進行了測試(使用NN插值法),但是操作始終是無損的。所有單元都旋轉,或者如果角度太小,則根本沒有單元旋轉。沒有輪換只能修改幾個單元格。這進一步增強了我的直覺,即必須對與縮放因子相關的無損旋轉進行表徵。也許無損旋轉僅在某些角度可能發生?
我建議在math.stackexchange.com上提問。
Michael Nielsen
2013-08-23 22:47:33 UTC
view on stackexchange narkive permalink

AJ關於提高分辨率的理論是正確的。問題是像元(像素)相對於我們能夠分辨出的細節的相對大小。單元格越大,將結果推入垃圾箱的次數就越多。在這裡,我用+10和-10的雙三次插值法旋轉並與abs(I1-I2)比較。其次,我進行lanczos調整大小x10,使用+10和-10進行三次三次插值旋轉,並調整大小回到原始大小,然後與abs(I1-I2)比較。

Resize effect

錯誤分佈有顯著差異:

Stats

那麼有兩個問題:1)是否可以針對給定的旋轉角度來計算尺寸調整因子?和2)插值法是否會引入錯誤,也就是說,調整大小並與最近的鄰居一起旋轉會更好嗎?
NN是應用多重轉換的最差方法。
Throwback1986
2013-08-24 01:02:18 UTC
view on stackexchange narkive permalink

由於執行旋轉所使用的浮點數(和方法)的精度有限,旋轉到“非基數”角總是有損耗的。

請注意,“有損”並不總是等於“明顯有損”。

*“請注意,”有損“並不總是等同於”明顯有損“。” *,我們又回到了原點-旋轉圖像確實會丟失信息,但通常不足以引起注意。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...