paul smith
paul smith

Reputation: 1347

Unable to unwrap image in OpenCV

I am trying to convert an image from cartesian to polar so that I can unravel the image, but I am getting a runtime error. If you are curious how this looks visually, see this example.

Code:

import scipy
import scipy.ndimage
import numpy as np
from math import *
import cv2

def logpolar(input):
    # This takes a numpy array and returns it in Log-Polar coordinates.

    coordinates = np.mgrid[0:max(input.shape[:])*2,0:360] # We create a cartesian array which will be used to compute log-polar coordinates.
    log_r = 10**(coordinates[0,:]/(input.shape[0]*2.)*log10(input.shape[1])) # This contains a normalized logarithmic gradient
    angle = 2.*pi*(coordinates[1,:]/360.) # This is a linear gradient going from 0 to 2*Pi

    # Using scipy's map_coordinates(), we map the input array on the log-polar coordinate. Do not forget to center the coordinates!
    lpinput = scipy.ndimage.interpolation.map_coordinates(input,(log_r*np.cos(angle)+input.shape[0]/2.,log_r*np.sin(angle)+input.shape[1]/2.),order=3,mode='constant')

    # Returning log-normal...
    return lpinput


# Load image
image = cv2.imread("test.jpg")
result = logpolar(image)


Error message in console:

Traceback (most recent call last):
  File "test.py", line 23, in <module>
    result = logpolar(image)
  File "test.py", line 15, in logpolar
    lpinput = scipy.ndimage.interpolation.map_coordinates(input,(log_r*np.cos(angle)+input.shape[0]/2.,log_r*np.sin(angle)+input.shape[1]/2.),order=3,mode='constant')
  File "/Library/Python/2.7/site-packages/scipy-0.13.0.dev_c31f167_20130415-py2.7-macosx-10.8-intel.egg/scipy/ndimage/interpolation.py", line 295, in map_coordinates
    raise RuntimeError('invalid shape for coordinate array')
RuntimeError: invalid shape for coordinate array

Upvotes: 1

Views: 2292

Answers (1)

Hammer
Hammer

Reputation: 10329

My first guess would be that you are passing in a colour image which is 3 dimensional. At first glance I don't think your code could handle that.

My guess was based off of the error you pasted, specifically "invalid shape for coordinate array" When using higher dimensional arrays like that usually you have to pass extra parameters around specifying which axis to repeat the operations over and even then sometimes it does not work. I didn't see a repeated extra integer at the end of your argument lists so I figured you weren't trying to handle that case explicitly and might have forgotten to check your array dimensions after reading in the image.

Glad it helped :)

Upvotes: 1

Related Questions