0
import sys, Image, scipy, cv2, numpy
from scipy.misc import imread
from cv2 import cv
from SRM import SRM

def ndarrayToIplImage (source):
"""Conversion of ndarray to iplimage"""
    image = cv.CreateImageHeader((source.shape[1], source.shape[0]), cv.IPL_DEPTH_8U, 3)
    cv.SetData(image, source.tostring(), source.dtype.itemsize * 3 * source.shape[1])
    return image

"""Main Program"""

filename = "snap.jpeg"
Q = 64

im = imread(filename)
name = filename[:-4]

img = Image.fromarray(im)

if img.size[0] > 200 or img.size[1] > 200:
    ratio = img.size[0]/img.size[1]
    size = int(ratio*200), 200
    img = numpy.array(img.resize(size, Image.ANTIALIAS))

    srm = SRM(img, Q)
    srm.initialization()
    srm.segmentation()
    classes, map = srm.map()

    """Converting ndarray to PIL Image to iplimage"""
    pil_img = Image.fromarray(map)
    cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3)
    cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
    print type(cv_img) ##prints <type 'cv2.cv.iplimage'>

    """Using ndarrayToIplImage function also gives the same error!"""

    """
    cv_img if of type iplimage but still gives error while using cv.ShowImage()
    or cv.SaveImage().

    There is no error displayed. Just the console hangs...

    """

我正在使用此页面上提供的 SRM(统计区域合并)包。

我刚刚更改了包中给出的示例程序。我必须将 SRM 包函数返回的类型转换为iplimage. 使用包没有错误,但在使用 opencv 函数的地方。

这是控制台在挂起后关闭后保存的图像。它使用了cv.SaveImage().

收到错误后

我试过cv2.imwrite()了,结果是这样的:

在此处输入图像描述

这是应该保存的图像。我曾经scipy.misc.imsave('image.jpg', map)保存过这个。

本来应该!

4

1 回答 1

2

为什么使用 IplImage 和 PIL?SRM 库读取 numpy 数组并从中获得 numpy 数组cv2.imread(image),然后如果需要调整 yuor 图像的大小,可以使用 opencv 函数cv2.resize(...)。最后,您可以使用 opencv 保存图像,cv2.imwrite(...)您的代码应如下所示:

import sys, cv2, numpy
from SRM import SRM

"""Main Program"""

filename = "snap.jpeg"
Q = 64

img = cv2.imread(filename)
name = filename[:-4]


if img.shape[0] > 200 or img.shape[1] > 200:
    ratio = img.shape[0] * 1. / img.shape[1]
    size = (int(ratio * 200), 200)

    img = cv2.resize(img, size, interpolation=cv2.INTER_LANCZOS4)

    srm = SRM(img, Q)

    srm.initialization()
    srm.segmentation()
    classes, srmMap = srm.map() # Map is a python function, use different variable name
    srmMap = srmMap.astype('uint8') # or you can try other opencv supported type 
    # I suppose that srmMap is your image returned as numpy array
    cv2.imwrite('name.jpeg', srmMap)
    # or
    cv2.imshow('image', srmMap)
    cv2.waitKey(0)
于 2013-10-03T18:00:45.210 回答