Scalar Motion

and a few stops along the way

Propeller Image Aliasing

Posted by ScalarMotion on March 15, 2009

Many people, who have tried taking a picture of a spinning airplane propeller with their cellphone cameras, have been surprised by the outcome. After all, they didn’t expect to see many ghostly propeller blades floating in the air without being totally detached to the airplane. Here is an example: a photograph of a rotating propeller taken by an iPhone.

iphone-spinning-propeller-shot1

If you click on the photograph, it’ll take you the forum where it was originally posted. Sure enough, you’ll also see the ususal cries of “photoshop”.

What really happens

The cameras on many cellphones are slow scanning digital cameras. When capturing an image, they  do not expose all the pixels at the same time. Rather they expose and capture one row of the sensor before moving onto the next. What this means is that different rows (or columns, depending on the orientation of the sensor) of the image are captured at different times. And during this interval the blades move appreciably. The entire thing is a bit difficult to visualize. So I have created a MATLAB simulation to demonstrate this effect in a slow-motion video. In the video below: a sensor is capturing the photograph of a spinning propeller by exposing one row at a time.

Simulation parameters: Propeller speed = 1800 RPM. Camera shutter speed = 1/15 s.

Notice the similarities between the simulation result and the propeller picture above?!

About these ads

46 Responses to “Propeller Image Aliasing”

  1. Ross youngblood said

    Interesting, if one knew the scan rate of the iPhone it might be a reliable propeller tachometer

  2. ScalarMotion said

    Absolutely right, Ross! I guess an iPhone app is around the corner. :)

  3. Alex said

    Really useful post. Could you upload or send the matlab code? I’d like to play with it a bit. Thanks.

    • ScalarMotion said

      Thanks, Alex.

      WordPress does not allow uploading a text file. But if you don’t mind getting the code from a PDF, here it is.

  4. […] the internet and found that I was not the only one to notice this oddity. I also stumbled upon this great post explaining clearly and graphically why the iPhone photo looks the way it does. In short, most […]

  5. Hi said

    Nice post. Looks like the iPhone scans left to right or right to left based on your simulation?

    • ScalarMotion said

      I am not sure. I guess if I knew the orientation of the camera when the pictures were taken, I could deduce the direction of scanning. But I do not own an iPhone, so cannot experiment. Yes, yes, there are still people out there who do not own an iPhone, :)

      Thanks for the comment.

    • Phlip said

      One interesting effect is that on the side where the propeller images are close together (the top on the original picture, the right in the video), they’re moving against the scan, and the orientation is preserved, but on the side where they’re far apart, they’re moving with the scan, and the images are mirror images of the real propellers. For instance, in the original photo, near the hub, on each blade, there’s a black stripe… on the top half of the image, this black stripe is on the clockwise-facing side, but on the bottom half it’s the anticlockwise-facing side (which means it’s on the right-hand side in both cases… which is most visible on the second warped blade from the left). So this means the black stripe is really on the clockwise side.

      Now, a comment on the original blog (for some reason, I can’t link to it without triggering a spam filter or something… but it’s comment #10) says that strip is on the leading edge of the propeller, so the prop would be spinning clockwise in that photo. So the top was moving left-to-right, against the scan, but the bottom was moving right-to-left, with the scan.

      So the scan was right-to-left in that photo.

      But like the guy says, we don’t know the orientation of the iPhone when the photo was taken… I don’t know much about the iPhone (I don’t own one either) but I do know you can hold it horizontally or vertically, and it’ll do fancy things… but that probably doesn’t include rotating the physical camera itself. So if it was horizontal when that photo was taken, then holding it vertically would have scan bottom-to-top… but if it was vertical when that photo was taken, then holding it horizontally would have it scan top-to-bottom.

  6. […] Propeller Image Aliasing « Scalar Motion ベーコン風味の爪楊枝とデンタルフロス » […]

  7. c00 said

    You are awesome! Movie explained it brilliantly.

  8. marc said

    Can you make the MATLAB code available?

    • ScalarMotion said

      %%%%%%%%%%%%% MATLAB CODE STARTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      %% Simulation of image aliasing due to pixel-wise scanning of a propeller.
      %% Assumptions:
      %% Propeller:
      %% 1. Constant angular velocity
      %% 2. Uniform visual cross-section of the blades (rectangular
      %% blades)
      %% Camera:
      %% 1. pixel-wise scanning left-to-right, from top to bottom.
      %% 2. no TV camera like interleaving

      %% Propeller description
      omega = 30; % Angular speed in rotations per second
      length = 200; % Length of the blades in cm
      width = 10; % Cross-section width in cm. (effective projection visible from the camera. assumed constant.)
      numBlades = 3; % number of blades
      discWidth = 0;

      %% Camera description
      frameSize = 600*[1 3/4]; % Width & height of the picture frame (in cm) at the plane of the propeller (assuming the propeller is at the center of the image)
      sensorSize = 400*[1 3/4]; % Sensor resolution in pixels
      frameDuration = 1/15; % Time (in seconds) taken to scan all pixels in the sensor

      %% Initializations
      initAngle = 0; % Initial orientation of the propeller. Can be assumed to be anything without loss of generality.
      numPixels = prod(sensorSize); % total number of pixels
      tArrScan = [1:numPixels]’*frameDuration/numPixels; % Time instants at which different pixels are sampled. Starting top-left.
      % posPixels: position of the pixels. matrix of dimension numPixels x 2. 1 row for each pixel. 2 elements
      % per pixel for X & Y coordinates.
      posPixels = -0.5+[reshape(repmat([sensorSize(2):-1:1], sensorSize(1), 1), numPixels, 1)-sensorSize(2)/2 mod([0:numPixels-1]’, sensorSize(1))+1-sensorSize(1)/2];

      posPixels = posPixels*frameSize(1)/sensorSize(1); % scaling to translate the pixels on plane of the propeller.
      distPixels = abs(posPixels * [1 i]’); % distance of the pixels from the center of the frame.
      angPixels = angle(posPixels * [i 1]’); % distance of the pixels from the center of the frame.

      %% Camera operation
      img = zeros(numPixels,1); % initialization
      for kk=0:numBlades-1 % do for each balde
      angleBlade = (2*pi/numBlades*kk)+initAngle+2*pi*mod(tArrScan*omega, 1); % position of the blade when the pixels are being scanned.
      distPixel2Blade = sum(posPixels .* [-cos(angleBlade) sin(angleBlade)], 2); % distance of the pixels (when they are scanned) from the axis of the blade
      distPixel2PerpOrigin = sum(posPixels .* [sin(angleBlade) cos(angleBlade)], 2); % distance of the pixels from the axis perpendicular to the blade at origin
      distPixel2PerpOutEnd = distPixel2PerpOrigin – length; % distance of the pixels from the axis perpendicular to the blade at the ouward end of the blade
      pixelIsBesideTheBlade = (distPixel2PerpOrigin .* distPixel2PerpOutEnd) <= 0; % Pixel is within the two ends of the blade
      img = img+ min(abs(distPixel2Blade)<width, pixelIsBesideTheBlade); % add 1 to the pixels that are: (1) within distance width/2 from the line of axis of the blade, and (2) within the two ends of the blade.
      end

      % figure; imagesc(min([reshape(img, sensorSize(1), sensorSize(2))]',1)); colormap(gray); axis equal; % convert the pixels to 2-D image

      %% Create a video to show the results progressively
      tmpimg = zeros(numPixels,1); % initialization
      figure; imagesc([reshape(tmpimg, sensorSize(1), sensorSize(2))]'); colormap(gray); axis equal;
      clf;
      set(gcf,'DoubleBuffer','on') % To reduce the flicker
      for ii=1:round(numPixels/100):numPixels % only sample 100 frames
      tmpimg = zeros(numPixels,1);
      tmpimg(1:ii) = min(1,img(1:ii));
      scnrow = ceil(ii/sensorSize(1));
      scncol = mod(ii-1,sensorSize(1))+1;
      scnimg = zeros(numPixels,1);
      scnimg((scnrow-1)*sensorSize(1)+[1:sensorSize(1)]) = 1; % mark the row
      % scnimg(scncol:sensorSize(1):end) = 1; % mark the column
      tmpimg(ii) = 1;
      bldimg = zeros(numPixels,1);
      for kk=0:numBlades-1 % do for each balde
      angleBladeTmp = (2*pi/numBlades*kk)+initAngle+2*pi*mod(tArrScan(ii)*omega, 1); % position of the blade when the pixels are being scanned.
      distPixel2BladeTmp = posPixels * [-cos(angleBladeTmp) sin(angleBladeTmp)]'; % distance of the pixels (when they are scanned) from the axis of the blade
      distPixel2PerpOriginTmp = posPixels * [sin(angleBladeTmp) cos(angleBladeTmp)]'; % distance of the pixels from the axis perpendicular to the blade at origin
      distPixel2PerpOutEndTmp = distPixel2PerpOriginTmp – length; % distance of the pixels from the axis perpendicular to the blade at the ouward end of the blade
      pixelIsBesideTheBladeTmp = (distPixel2PerpOriginTmp .* distPixel2PerpOutEndTmp) <= 0; % Pixel is within the two ends of the blade
      bldimg = bldimg+ min(abs(distPixel2BladeTmp)<width, pixelIsBesideTheBladeTmp); % add 1 to the pixels that are: (1) within distance width/2 from the line of axis of the blade, and (2) within the two ends of the blade.
      end

      pause(1/1000);
      imagesc(min([reshape(tmpimg+scnimg+bldimg, sensorSize(1), sensorSize(2))]',1)); colormap(gray); axis equal;
      % imagesc([reshape(max(max(2*tmpimg,scnimg),bldimg), sensorSize(1), sensorSize(2))]'); colormap(gray); axis equal;
      end
      imagesc(min([reshape(img, sensorSize(1), sensorSize(2))]',1)); colormap(gray); axis equal;

      %%%%%%%%%%%%% MATLAB CODE ENDS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  9. That’s great! Now I’m tempted to take your Matlab script, find a promising set of RPMs and try to generate specific effects with a real plane.

  10. Fascinating. Thanks very much for this. I’m totally willing to accept this explanation. But there’s one little feature that still nags me. When I took a picture that produced this effect, I was shooting a pic of one of two props (I was in a 2-engine plane at the time). But when I pointed my iphone out the other window, at the other prop, I didn’t see the effect at all. I moved the iphone back and forth between the 2 engines several times. Only the one engine produced the effect. This is why I wonder if polarization of the windows and angle of incident light can play a role too.

    Still, thanks very much for a great explanation.

    • Phlip said

      I suspect it might be just that you were further away from the propeller on the other side of the plane… the effect would be stronger if the propeller filled the frame, than if the propeller only took up part of the frame… since it’ll take less time for the scan to cross the prop if it’s smaller.

      Note that if you have digital zoom, then what matters is the pre-zoomed size of the propeller. If you have optical zoom then the post-zoomed size is what matters, but from what I can tell, the iPhone doesn’t have optical zoom (and even digital zoom requires a special app, it’s not built in).

    • ScalarMotion said

      Nice catch, Philip. I think that’s what must have happened.

      Yet another factor could be the changes in the shutter speed from one picture to another. Like if there was direct sunlight coming from the other side, that could prompt the iPhone to use a faster shutter speed.

    • Nick said

      Re seeing the effect on one propeller but not the other:

      This is possibly because the two propellers might be rotating at different speeds, and the appearance of the effect depends on the relationship between prop speed and shutter speed.

      It’s like the effect you see on some films that show car wheels moving. Depending on the speed of the car, it’s wheels might appear to be rotating slowly backwards, rotating slowly forwards, being stationary or they might blur into an unrecognisable image. This film shows the effect quite well:

      Notice that at some speeds the wheel spokes are visible while at other speeds they seem to disappear and all you can see is the brake blocks.

      So it might be that the propeller on one side is turning at a rate that causes coherent patterns with the shutter, while the other propeller is just out of sync, resulting in no discernable pattern.

      Cheers

      Nick

  11. carlo said

    Propellors spin in opposite directions on either side of the fuselage,
    which would account for a difference. If the timing was “just right”
    I guess that would be an immense difference, maybe to the extent that
    one side isnt captured at all.

  12. […] interesting and has to do with how phones capture movies and the speed of the propeller – there’s a good explanation of that here. Enjoy the […]

  13. […] Propeller Image Aliasing В« Scalar Motion Mar 15, 2009 … Notice the similarities between the simulation result and the propeller picture above? … […]

  14. Lulla said

    another nice example:

    http://imgur.com/gallery/TdVt9

  15. incident notification software…

    […]Propeller Image Aliasing « Scalar Motion[…]…

  16. Short URL Service…

    […]Propeller Image Aliasing « Scalar Motion[…]…

  17. EOS Review said

    EOS Review…

    […]Propeller Image Aliasing « Scalar Motion[…]…

  18. dreamcash said

    dreamcash…

    […]Propeller Image Aliasing « Scalar Motion[…]…

  19. uggs moccasins…

    […]Propeller Image Aliasing « Scalar Motion[…]…

  20. Nathan said

    You really make it appear really easy along with your
    presentation however I find this matter to be actually something which I believe I’d by no means understand. It kind of feels too complicated and extremely large for me. I’m looking forward for your subsequent publish,
    I’ll attempt to get the dangle of it!

  21. Cayden said

    Howdy, I believe your website might be having browser compatibility issues.
    When I take a look at your blog in Safari, it looks fine but when opening in I.
    E., it’s got some overlapping issues. I merely wanted to give you a quick heads up! Apart from that, great site!

  22. It’s a shame you don’t have a donate button! I’d certainly donate to this superb blog! I suppose for now i’ll settle
    for book-marking and adding your RSS feed to
    my Google account. I look forward to new updates and will
    talk about this site with my Facebook group. Chat soon!

  23. Today, I went to the beachfront with my children. I found
    a sea shell and gave it to my 4 year old daughter
    and said “You can hear the ocean if you put this to your ear.” She placed the
    shell to her ear and screamed. There was a hermit crab inside and it pinched her
    ear. She never wants to go back! LoL I know this is totally off topic but I
    had to tell someone!

  24. Please let me know if you’re looking for a author for your blog. You have some really great articles and I think I would be a good asset. If you ever want to take some of the load off, I’d love to write some articles for
    your blog in exchange for a link back to mine.
    Please blast me an e-mail if interested. Cheers!

  25. I know this web site gives quality depending posts and extra material, is
    there any other site which gives these information in quality?

  26. I love what you guys are up too. This kind
    of clever work and coverage! Keep up the terrific works guys I’ve included you guys to my blogroll.

  27. No quantity of meals will ever sooth the pain in your soul, the fear of getting
    alone tomorrow or the lack of really like you crave for.

  28. Some took a small longer, due to the fact that they have had the
    skin illness for several years.

  29. The other day, while I was at work, my cousin stole my iPad and tested to
    see if it can survive a thirty foot drop, just so she can be a youtube sensation.
    My iPad is now destroyed and she has 83
    views. I know this is entirely off topic but I had to share it with someone!

  30. Metabolic price is an very first approach along with diet regime is the following technique.

  31. renovation said

    What’s up, all is going sound here and ofcourse every one is sharing facts, that’s really good, keep up writing.

  32. Going by way of this,the user is offered with answers to
    his queries.

  33. Thank you a bunch for sharing this with all people you really understand what you are speaking approximately!

    Bookmarked. Kindly also talk over with my web site =). We can
    have a link exchange agreement between us

  34. Hey excellent website! Dude. Stunning. Great. I am going to take a note of your web site along with go ahead and take feeds additionally? Now i am pleased to locate quite a few useful facts listed here within the placed, we end up needing work out a lot more tactics in this regard, we appreciate you expressing.

  35. […]   iphoneや古いカメラで撮影すると動画も静止画もこんな風になることがあるらしい。                                     Scalar Motionより […]

  36. […] iPhone Propeller Image Aliasing Many people, who have tried taking a picture of a spinning airplane propeller with their cellphone cameras, have been surprised by the outcome. After all, they didn’t expect to see many ghostly propeller blades floating in the air without being totally detached to the airplane… […]

  37. This piece of writing will help the internet viewers for creating new weblog or
    even a blog from start to end.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

%d bloggers like this: