Comments (7)
There are two issues here:
- There are some numerical errors on
pi/2
because you can't representpi
arbitrarily precisely. (see also #145) - The default
imrotate
output is the minimal array that encloses all pixels in the original image
There are two options to workaround this:
- use the Base function
rotr90(img)
(alsorotl90
androt180
) - clip the output by passing axes:
imrotate(img, pi/2, axes(img))
I'm going to close this issue as it's very much duplicated of #145
from imagetransformations.jl.
Rotating the 2D array by 90 degree is just for testing purposes: the actual angle is in principle any value in [0, 2pi). What puzzles me is the behavior of imrotate
, especially its not NaN structure after rotation. As a first time user to this function, I believe I am not the only one to be confused.
Even with axes
:
julia> imrotate(img, pi/2, axes(img))
4×4 Matrix{Float64}:
NaN NaN 4.99995 NaN
14.0 9.99998 5.99999 NaN
NaN 11.0 7.00002 3.00003
NaN 12.0 NaN NaN
I am not sure if using any kind of low order interpolation (e.g. Closest()
) will avoid the NaN fillings.
Since my goal is to reproduce the result in scipy, I guess I should go with warp
then?
from imagetransformations.jl.
I'm reopening because the differences are due to the strategy for handling roundoff error in #58 (comment):
julia> using Debugger
julia> @enter imrotate(img, π/2, axes(img))
In #imrotate#9(kwargs, , img, θ, inds) at /home/tim/.julia/packages/ImageTransformations/O9GYH/src/warp.jl:245
245 function imrotate(img::AbstractArray{T}, θ::Real, inds::Union{Tuple, Nothing} = nothing; kwargs...) where T
246 # TODO: expose rotation center as a keyword
>247 θ = floor(mod(θ,2pi)*typemax(Int16))/typemax(Int16) # periodic discretezation
248 tform = recenter(RotMatrix{2}(θ), center(img))
249 # Use the `nothing` trick here because moving the `autorange` as default value is not type-stable
250 inds = isnothing(inds) ? autorange(img, inv(tform)) : inds
251 warp(img, tform, inds; kwargs...)
252 end
About to run: (*)(2, π)
1|debug> n
In #imrotate#9(kwargs, , img, θ, inds) at /home/tim/.julia/packages/ImageTransformations/O9GYH/src/warp.jl:245
245 function imrotate(img::AbstractArray{T}, θ::Real, inds::Union{Tuple, Nothing} = nothing; kwargs...) where T
246 # TODO: expose rotation center as a keyword
247 θ = floor(mod(θ,2pi)*typemax(Int16))/typemax(Int16) # periodic discretezation
>248 tform = recenter(RotMatrix{2}(θ), center(img))
249 # Use the `nothing` trick here because moving the `autorange` as default value is not type-stable
250 inds = isnothing(inds) ? autorange(img, inv(tform)) : inds
251 warp(img, tform, inds; kwargs...)
252 end
About to run: (Core.apply_type)(RotMatrix, 2)
1|julia> θ
1.5707876827295755
1|julia> π/2
1.5707963267948966
That's a pretty large difference from what the user entered.
from imagetransformations.jl.
Thanks! Another tiny issue I want to mention is the fillvalue
keyword:
julia> imrotate(img, pi/2, axes(img), fillvalue=0.0)
4×4 Matrix{Float64}:
NaN NaN 4.99995 NaN
14.0 9.99998 5.99999 NaN
NaN 11.0 7.00002 3.00003
NaN 12.0 NaN NaN
Seemingly contrary to the method doc
fillvalue
: the value that used to fill the new region. The default value is NaN if possible, otherwise is 0.
I don't observe any changes to the output in this case.
from imagetransformations.jl.
I can't replicate that; in a revised version of #148 I added these tests:
@test any(isnan, imrotate(img, π/3))
@test !any(isnan, imrotate(img, π/3; fillvalue=0.0))
@test !any(isnan, imrotate(img, π/3, fillvalue=0.0))
@test any(isnan, imrotate(img, π/3, axes(img)))
@test !any(isnan, imrotate(img, π/3, axes(img); fillvalue=0.0))
@test !any(isnan, imrotate(img, π/3, axes(img), fillvalue=0.0))
and they all pass.
from imagetransformations.jl.
Sorry I just found that I was accidentally using an earlier version 0.8.13, probably due to some restrictions of other packages.
from imagetransformations.jl.
We really need to get Images 0.25 out!
julia> using RegistryCompatTools
help?> RegistryCompatTools
search: RegistryCompatTools
RegistryCompatTools makes it easier to discover packages that need [compat] updates.
• held_back_by("SomePkg") - which packages are holding back SomePkg?
• held_back_packages()["SomePkg"] - which packages does SomePkg hold back?
• find_julia_packages_github() - discover which packages I can push to
julia> held_back_by("ImageTransformations")
15-element Vector{String}:
"ADI"
"Asimov"
"Augmentor"
"BasicTextRender"
"CameraCalibrations"
"DataAugmentation"
"EasyML"
"HCIToolbox"
"Images" # not good...
"MIRT"
"MakieGallery"
"Photometry"
"UNet"
"WordCloud"
"YOLO"
from imagetransformations.jl.
Related Issues (20)
- Does ForwardDiff work with ImageTransformations? HOT 3
- demo: grid stretching and elastic transformation
- add swirl function HOT 1
- Images getting generated differently HOT 4
- No stable version document is deployed HOT 6
- Add `Projective` transformation HOT 2
- Demos using CoordinateTransformations and Rotations
- Repeated warping HOT 6
- `imrotate(img, pi/2)` changes size of image HOT 3
- Rotation operation is inaccurate HOT 2
- Custom image transformation? HOT 4
- imresize without interpolation for integer upscaling
- imflip function
- The reference frame associated to an image is not the best one to perform a shear transformation HOT 6
- Support for autodiff in warping?
- Support v0.15 of Interpolations.jl HOT 1
- Warp seems to be off HOT 1
- Add docs for imresize!
- Cropping after warp HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from imagetransformations.jl.