与x265和jpeg2000编解码器的奇怪压缩比

时间:2016-12-16 17:45:07

标签: hevc jpeg2000

我使用x265和libjasper(jasper Jpeg2000)编解码器实现了图片编码软件,我在无损压缩模式下有奇怪的比率压缩。

我的比例压缩是 {-# LANGUAGE GeneralizedNewtypeDeriving #-} import Data.List import Debug.Trace (trace) main = print $ runUniverse makeUniverse 0.1 0.01 newtype Length = Length {unLength::Double} newtype Mass = Mass {unMass::Double} deriving (Num,Eq,Show) newtype Charge = Charge {unCharge::Double} deriving (Num,Eq,Show) newtype Time = Time {unTime::Double} deriving (Num,Eq,Ord,Fractional) type Vector = (Double,Double,Double) newtype Position = Position {unPosition::Vector} deriving (Eq,Show) newtype Velocity = Velocity {unVelocity::Vector} deriving (Eq,Show) newtype Acceleration = Acceleration {unAcceleration::Vector} newtype Force = Force {unForce::Vector} deriving (Eq,Show) data Widget = Widget {pos :: Position, mass :: Mass, charge :: Charge, velocity :: Velocity} deriving (Eq, Show) --utils toScalar :: Vector -> Double toScalar (x, y, z) = sqrt (x ^^ 2 + y ^^ 2 + z ^^ 2) toUnit :: Vector -> Vector toUnit (x, y, z) = (x / scalar, y / scalar, z / scalar) where scalar = toScalar (x, y, z) add :: Vector -> Vector -> Vector add (x1, y1, z1) (x2, y2, z2) = (x1 + x2, y1 + y2, z1 + z2) mult :: Vector -> Double -> Vector mult (x, y, z) k = (k * x, k * y, k * z) diff :: Vector -> Vector -> Vector diff (x1, y1, z1) (x2, y2, z2) = (x1 - x2, y1 - y2, z1 - z2) --calcs gForce :: Widget -> Widget -> Force gForce (Widget (Position pos1) (Mass mass1) _ _) (Widget (Position pos2) (Mass mass2) _ _) = Force (mult unitForce scalarForce) where unitForce = toUnit posdiff scalarForce = (g * mass1 * mass2) / (radius ^^ 2) g = 6.674e-11 radius = toScalar posdiff posdiff = diff pos1 pos2 eForce :: Widget -> Widget -> Force eForce (Widget (Position pos1) _ (Charge charge1) _) (Widget (Position pos2) _ (Charge charge2) _) = Force (mult unitForce scalarForce) where unitForce = (toUnit posdiff) --necessary to determine attraction vs repulsion, whereas gravitational is always attractive scalarForce = ((abs (k_C * charge1 * charge2)) / (radius ^^ 2)) * (signum charge1) * (signum charge2) k_C = 8.988e9 radius = toScalar posdiff posdiff = diff pos1 pos2 netForce :: [Force] -> Force netForce = Force . foldl add (0,0,0) . map unForce toAccel :: Force -> Widget -> Acceleration toAccel f (Widget _ mass _ _) = Acceleration (mult (unForce f) (unMass mass)) newVeloc :: Velocity -> Acceleration -> Time -> Velocity newVeloc v a dt = Velocity (add (unVelocity v) (mult (unAcceleration a) (unTime dt))) newPos :: Position -> Velocity -> Time -> Position newPos s v dt = Position (add (unPosition s) (mult (unVelocity v) (unTime dt))) newWidget :: Widget -> Position -> Velocity -> Widget newWidget w@(Widget pos1 _ _ vel1) dpos dvel = w { pos=Position ((unPosition dpos)),velocity=Velocity ((unVelocity dvel)) } tUniverse :: [Widget] -> Time -> [Widget] tUniverse widgets dt = zipWith3 newWidget widgets (trace (show poses) poses) (trace (show vels) vels) where netMassForces = map (\w -> gForcePrime w (widgets \\ [w])) widgets gForcePrime w ws = netForce $ map (gForce w) ws netElectricForces = map (\w -> eForcePrime w (widgets \\ [w])) widgets eForcePrime w ws = netForce $ map (eForce w) ws volds = map velocity widgets polds = map pos widgets accels = zipWith toAccel (map netForce (zipWith (\a b -> a : [b]) netMassForces netElectricForces)) widgets vels = zipWith (\v a -> newVeloc v a dt) volds accels poses = zipWith (\s v -> newPos s v dt) polds vels makeUniverse :: [Widget] makeUniverse = [Widget (Position (1,0,0)) (Mass 0) (Charge 0) (Velocity (1,0,0))] -- , (Widget (1, 0, 0) 9e-31 1 (0, 0, 0))] runUniverse :: [Widget] -> Time -> Time -> [Widget] runUniverse ws t dt | t < 0 = ws | otherwise = runUniverse (tUniverse (inelasticCollide ws) dt) (t-dt) dt inelasticCollide :: [Widget] -> [Widget] inelasticCollide [] = [] inelasticCollide (w:[]) = [w] inelasticCollide (w:ws) = (combine w (sameposes w ws)) : (inelasticCollide $ ws \\ (sameposes w ws)) where sameposes w ws = filter (\w' -> pos w == pos w') ws combine :: Widget -> [Widget] -> Widget combine = foldl (\(Widget pos mass1 charge1 veloc1) (Widget _ mass2 charge2 veloc2) -> Widget pos (mass1 + mass2) (charge1 + charge2) (Velocity (newveloc (unMass mass1) (unMass mass2) (unVelocity veloc1) (unVelocity veloc2)))) --inelastic collision, m1v1 + m2v2 = m3v3 therefore v3 = (m1v1 + m2v2)/(m1 + m2) newveloc m1 m2 v1 v2 = ((v1 `mult` m1) `add` (v2 `mult` m2)) `mult` (1 / (m1 + m2))

大多数研究表明hevc优于jpeg2000但在我的情况下,jpeg2000比率优于x265比率。 我也使用jasper软件和x265软件获得相同的结果。

所以我想也许我的x265输入参数不正确......

通常情况下,我正在处理单色图像,8位深度。但是我用彩色图片做了同样的测试,我得到了相同的结果。

此处有彩色图片的相同结果(原始图片)http://mmspg.epfl.ch/iqa

( 1 - output_stream_size / initial_picture_size).

Hevc输出跟踪Hevc encoder output trace

输出文件大小:

原始输入:6144017字节

hevc bitstream:5637967 bytes

jp2比特流:3261791字节

编解码器版本

x265 --psy-rd 1.0 --lossless --input-res 1280x1600 --input-csp i420 --fps 1 --preset veryslow  --profile mainstillpicture bike_orig.yuv bike_orig.bin

jasper -f bike_orig.ppm -F bike_orig.jp2 -T jp2

有没有人知道我为什么会有这样的结果。

谢谢你。

2 个答案:

答案 0 :(得分:0)

在考虑无损编码时,JPEG2000压缩比优于HEVC。这主要原因似乎是JPEG2000中discrete wavelet transformation优于discrete cosine transformation的优势。

有关进一步的详细信息,请参阅this。 (评估:HEVC,H.264 / AVC,JPEG 2000和JPEG LS)

编辑:关于静态图片编码,JPEG2000可能更加优越,因为HEVC无法利用帧间视频压缩。

答案 1 :(得分:0)

感谢您的回答。我已经阅读了这篇论文来证明我的结果。但我注意到这篇文章介绍了有关视频(动态图片)的结果。我们可以将其扩展到静态图片。那么我们可以比较Jpeg2000和HEVC MainStill Picture(MSP)吗?