无法将Pixel转换为正确形状的图像,从cv代码到cv2代码

时间:2016-02-23 12:17:16

标签: python c++ opencv

最近我尝试为我的工作做一些图像处理。 不幸的是,我一直试图将cv支持的旧C ++代码应用于支持cv2的python代码。 它不能很好地工作......任何人都可以帮助我吗?

原始C ++代码:

#define IMAGE_WIDE  40
#define IMAGE_LENGTH    30
#define CHANNELS    3

DNN_image_out = cvCreateImage(cvSize(IMAGE_WIDE, IMAGE_LENGTH), IPL_DEPTH_8U, 3);
for(int k = 0; k < IMAGE_LENGTH; k++){  //縦
        for(int l = 0; l < IMAGE_WIDE; l++){    //横
            DNN_image_out[i]->imageData[(k * IMAGE_WIDE + l)*3 +0] = DNN_image_tmp[(k * IMAGE_WIDE + l)*3 + 0 ];
            DNN_image_out[i]->imageData[(k * IMAGE_WIDE + l)*3 +1] = DNN_image_tmp[(k * IMAGE_WIDE + l)*3 + 1 ];
            DNN_image_out[i]->imageData[(k * IMAGE_WIDE + l)*3 +2] = DNN_image_tmp[(k * IMAGE_WIDE + l)*3 + 2 ];
        }
    }

我的Python CV2代码:

import numpy as np
import cv2

def split_channel3(array,width,height):
    R=[]
    G=[]
    B=[]
    for k in range(height):
        for l in range(width):
            R.append(array[(k * width + l)*3 +0])
            G.append(array[(k * width + l)*3 +1])
            B.append(array[(k * width + l)*3 +2])
    R = np.asarray(R)
    G = np.asarray(G)
    B = np.asarray(B)
    return [R,G,B]


[R,G,B] = split_channel3(img,40,30)
R = R.reshape(40,30,1)
G = G.reshape(40,30,1)
B = B.reshape(40,30,1)
Color_img = np.dstack((R,G))
Color_img = np.dstack((Color_img,B))
cv2.imshow('image',Color_img)
cv2.waitKey(0)

我的逻辑错了吗?或者我应该在python代码中更改什么?

1 个答案:

答案 0 :(得分:1)

您只需使用cv2.split即可,无需使用自定义功能,也无需使用reshape

B,G,R = cv2.split(img)

然后逐渐使用:

Color_img  = cv2.merge((B,G,R))

请记住,默认情况下,OpenCV中的通道为B,G,R,而不是R,G,B。