# Performance comparison of horizontal & vertical flipping

cv::flip function internally calls flipHoriz or flipVert functions.

When i compared the passing time of vertical flipping and horizontal flipping with the code below i get following results.

• flipVert process time (averaged for 500 runs): 0.286388 milliseconds.
• flipHoriz process time (averaged for 500 runs): 1.09012 milliseconds.

i thought that flipVert has different algorihtm (i did not understand deeper) and faster than flipHoriz .

i wonder is it possible to apply flipVert's algorihtm to flipHoriz.

( i edited the code adding more processes to compare )

• src.clone process time (averaged for 500 runs): 0.793516 milliseconds.
• src * 2 .. process time (averaged for 500 runs) : 0.39996 milliseconds.

#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <iostream>

int main()
{
cv::Mat DstImg;

const int times = 500;
double t;

t = (double)cv::getTickCount();

for (int i = 0; i < times; ++i)
{
flip(SrcImg, DstImg, 0);
}

t = 1000*((double)cv::getTickCount() - t)/cv::getTickFrequency();
t /= times;

std::cout << "flipVert  process time (averaged for "
<< times << " runs): " << t << " milliseconds."<< std::endl;

t = (double)cv::getTickCount();

for (int i = 0; i < times; ++i)
{
flip(SrcImg, DstImg, 1);
}

t = 1000*((double)cv::getTickCount() - t)/cv::getTickFrequency();
t /= times;

std::cout << "flipHoriz process time (averaged for "
<< times << " runs): " << t << " milliseconds."<< std::endl;

t = (double)cv::getTickCount();

for (int i = 0; i < times; ++i)
{
DstImg = SrcImg.clone();
}

t = 1000*((double)cv::getTickCount() - t)/cv::getTickFrequency();
t /= times;

std::cout << "src.clone process time (averaged for "
<< times << " runs): " << t << " milliseconds."<< std::endl;

t = (double)cv::getTickCount();

for (int i = 0; i < times; ++i)
{
DstImg = SrcImg * 2;
}

t = 1000*((double)cv::getTickCount() - t)/cv::getTickFrequency();
t /= times;

std::cout << "src * 2   process time (averaged for "
<< times << " runs): " << t << " milliseconds."<< std::endl;
return 0;
}

edit retag close merge delete

Think about how the image is laid out in memory. A horizontal flip is a reordering of columns, which are scalar data (not contiguous in memory over rows), whereas vertical flipping is a reordering of the rows which are vectors (large chunks) of data. Operating on large chunks will be much faster. The horizontal flip may be vectorized, but it will have the additional step of a remapping or a permutation of the elements and so will be slower.

( 2015-10-24 10:37:16 -0500 )edit

Sort by » oldest newest most voted

IMO, the flip function's performance is depend on several factors:

• The OpenCV build: because OpenCV can be built with OpenCL support, and IPP support, so when running, your program can call the normal version (no OpenCL or IPP support), or the OpenCL version, or the IPP version.
• The image resolution: if the width is much larger than then the height (or vice versa) then the result is different.
• And the memory access mechanism (as @Der Luftmensch mentioned): with horizontal flip, it should be faster because accessing matrix's elements row by row is faster than column by column.

My reproduced results when running your code on my machine (Duo Core 2x2.4 Ghz, OpenCV 3 with IPP no OpenCL, VS 2013 64 bit) are different from yours:

Image 1 (500x800):

• flipVert process time (averaged for 500 runs): 0.66 ms
• flipHoriz process time (averaged for 500 runs): 0.43 ms

Image 2 (500x500):

• flipVert process time (averaged for 500 runs): 0.66 ms
• flipHoriz process time (averaged for 500 runs): 0.25 ms

Image 3 (800x500):

• flipVert process time (averaged for 500 runs): 0.74 ms
• flipHoriz process time (averaged for 500 runs): 0.37 ms
more

thanks for the answer. but i think i need some more responses to understand what happens here.

( 2015-10-24 12:00:42 -0500 )edit

Official site

GitHub

Wiki

Documentation

## Stats

Seen: 498 times

Last updated: Oct 24 '15