两大小通道均不同的Qimage合成一个

两大小通道均不同的Qimage合成一个


此项目中image1为大图作为背景,image2是拥有alpha通道的透明图,大小都是1080*1920,但要实现将image2缩小后与图一叠加。
分别获取两图的数据给buffer、buffer2再进行计算,注意:Qimage需要对存储数据进行对齐。

	m_buffer_cur= new unsigned char[1920*1080*4*4];
    m_buffer_cur1= new unsigned char[1920*1080*4*4];

    m_buffer1 = image1.bits();
    m_img1_w = image1.width();
    m_img1_h = image1.height();
    m_img1_channel = image1.depth() / 8;          //每像素字节数
    bytes_pre_line1 = image1.bytesPerLine();      //每行字节数

    int w3 = (double)image1.width() * m_gifLbl->width() / m_previewWgt->width();
    int h3 = (double)image1.height() * m_gifLbl->height() / m_previewWgt->height();
    qDebug() << m_gifLbl->width() << m_gifLbl->height();
    QImage image3 = image2.scaled(w3, h3);
    QImage image4 = image1.scaled(m_resultWgt->width(),m_resultWgt->height());
    
	m_buffer2 = image3.bits();
    m_img2_w = image3.width();
    m_img2_h = image3.height();
    m_img2_channel = image3.depth() / 8;
    bytes_pre_line2 = image3.bytesPerLine();
    
    bytePerLine=(m_img1_w * 24 + 31) / 32 * 4; //存储数据32对齐
    offset_X = 10;
    offset_Y = 10;
    end_x = offset_X + m_img2_w;
    end_y = offset_Y + m_img2_h;
    
	copyImage2buffer(m_buffer_cur, 3, m_buffer1, m_img1_w, m_img1_h, m_img1_channel);
    memcpy(m_buffer_cur1, m_buffer2, bytes_pre_line2 * m_img2_h);
    CompositeImage(m_buffer_cur, m_img1_w, m_img1_h, 3,
                   m_buffer_cur1, m_img2_w, m_img2_h, m_img2_channel, 0, 0);

关键函数copyImage2buffer():

void LiveSystem::copyImage2buffer(unsigned char* dst,int channel_dst,
                                  unsigned char* src, int src_w, int src_h,
                                  int channel_src)
{
    unsigned char r = 0;
    unsigned char g = 0;
    unsigned char b = 0;

    int pix_index_dst = 0;
    int pix_index_src = 0;

//    int line_step_dst = (src_w * 24 + 31) / 8; //存储数据32对齐
    int line_step_dst = (src_w * channel_dst * 8 + 31) / 32 * 4; //存储数据32对齐
    int line_step_src = (src_w * channel_src * 8 + 31) / 32 * 4;
//    line_step_dst = src_w * 3;

    qDebug() <<"--->"<< channel_dst<<line_step_dst<<channel_src<< line_step_src;

    for (int i = 0; i < src_h ; i++ ) {
        for (int j = 0; j < src_w ; j++ ) {
            pix_index_dst = i * line_step_dst + j * channel_dst;
            pix_index_src = i * line_step_src + j * channel_src;

            b = src[pix_index_src + 0];
            g = src[pix_index_src + 1];
            r = src[pix_index_src + 2];
            //
            dst[pix_index_dst + 0] = r;
            dst[pix_index_dst + 1] = g;
            dst[pix_index_dst + 2] = b;
        }
    }

}

CompositeImage():

void LiveSystem::CompositeImage(unsigned char* dst, int dst_w, int dst_h, int channel_dst,
                                unsigned char* src, int src_w, int src_h, int channel_src,
                                int offset_x, int offset_y)
{
    unsigned char r = 0;
    unsigned char g = 0;
    unsigned char b = 0;
    float alphal = 1.0;

    int pix_index_dst = 0;
    int pix_index_src = 0;

    int line_step_dst = (dst_w * channel_dst * 8 + 31) / 32 * 4; //存储数据32对齐
    int line_step_src = (src_w * channel_src * 8 + 31) / 32 * 4;
//    line_step_dst = src_w * 3;

    qDebug() <<"--->"<< channel_dst<<line_step_dst<<channel_src<< line_step_src;
    qDebug() <<"1--->"<< offset_x<<offset_y;

    for (int i = 0; i < src_h; i++) {
        if (i + offset_y >= dst_h) {
            break;
        }

        for (int j = 0; j < src_w ; j++) {
            if (j + offset_x >= dst_w) {
                break;
            }

            pix_index_src = i * line_step_src + j * channel_src;
            pix_index_dst = (i + offset_y) * line_step_dst + (j + offset_x) * channel_dst;

            b = src[pix_index_src + 0];
            g = src[pix_index_src + 1];
            r = src[pix_index_src + 2];
            alphal = src[pix_index_src + 3]  / 255;

            dst[pix_index_dst + 0] = dst[pix_index_dst + 0] * (1 - alphal) + r * alphal;
            dst[pix_index_dst + 1] = dst[pix_index_dst + 1] * (1 - alphal) + g * alphal;
            dst[pix_index_dst + 2] = dst[pix_index_dst + 2] * (1 - alphal) + b * alphal;
        } 

    } 
}
### 回答1: 以下是HVS三个通道合成的代码: float3 HVS(float3 rgb) { float3 hvs = float3(., ., .); hvs.r = .2989 * rgb.r + .587 * rgb.g + .114 * rgb.b; hvs.g = .5 * rgb.r - .4187 * rgb.g - .0813 * rgb.b + 128.; hvs.b = -.1687 * rgb.r - .3313 * rgb.g + .5 * rgb.b + 128.; return hvs; } ### 回答2: HVS(Human Visual System)是人类视觉系统的简称,它包括人眼、视网膜以及大脑中的视觉处理部分。HVS三个通道指的是亮度(Luminance)、色度红(Chrominance Red)和色度蓝(Chrominance Blue)三个通道。 下面是一段用Python编写的代码示例,用于将HVS三个通道合成: ```python import cv2 import numpy as np # 读取彩色图像 image = cv2.imread('input_image.jpg') # 将图像转换为YUV颜色空间 yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV) # 将YUV图像分解为亮度、色度红、色度蓝三个通道 y_channel, u_channel, v_channel = cv2.split(yuv_image) # 计算亮度通道 luminance_channel = y_channel # 将色度红和色度蓝通道缩小到与亮度通道相同的大小 u_channel_resized = cv2.resize(u_channel, (luminance_channel.shape[1], luminance_channel.shape[0])) v_channel_resized = cv2.resize(v_channel, (luminance_channel.shape[1], luminance_channel.shape[0])) # 合成HVS三个通道 hvs_image = cv2.merge((luminance_channel, u_channel_resized, v_channel_resized)) # 显示合成的图像 cv2.imshow('HVS Image', hvs_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码首先使用OpenCV库读取彩色图像,并将其转换为YUV颜色空间。然后,将YUV图像分解为亮度、色度红、色度蓝三个通道。接下来,直接将亮度通道作为合成的HVS图像的亮度通道,并将色度红和色度蓝通道缩小到与亮度通道相同的大小。最后,使用OpenCV的merge函数将三个通道合成为最终的HVS图像,并显示出来。 需要注意的是,以上代码中的input_image.jpg应替换为实际的图像文件路径。此外,为了运行以上代码,还需安装OpenCV库,可以通过pip安装:pip install opencv-python。 ### 回答3: HVS(Hue-Value-Saturation)是一种常用的颜色空间,用于描述颜色的色调、明度和饱和度。要合成HVS三个通道,可以使用以下代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg') # 转换颜色空间为HVS hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 分离通道 h_channel = hsv_image[:,:,0] v_channel = hsv_image[:,:,1] s_channel = hsv_image[:,:,2] # 合成通道 hvs_image = cv2.merge([h_channel, v_channel, s_channel]) # 显示合成结果 cv2.imshow('HVS Image', hvs_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码使用了OpenCV库中的`cvtColor`函数将原始图像转换为HVS颜色空间。然后,通过使用numpy库的数组索引,我们可以提取出H、V和S通道的像素值。最后,使用`merge`函数将这三个通道重新合成为HVS图像,并通过`imshow`函数显示合成结果。 请注意,代码中的`'image.jpg'`是需要替换为实际图像路径的部分。此外,导入了必要的库以便正确运行代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值