实战之HTML:把两张图片并排(行)显示

在武汉疫情期间,肖战的粉丝“小飞侠”们展现了正能量,积极为武汉捐款捐物,展现了偶像与粉丝共同成长的力量。然而,肖战本人也遭受了不必要的指责。此次事件凸显了新生代艺人在社会公益中的影响力。
更改方式:

<table><tr>
<td><img src=pic1.jpg border=0></td>
<td><img src=pic2.jpg border=0></td>
</tr></table>

<table> 标签定义 HTML 表格。

简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。

tr 元素定义表格行,th 元素定义表头,td 元素定义表格单元(列)。

 

eg:

#武汉疫情明星捐款# 都说正能量的偶像影响正能量的粉丝,在这次疫情中,肖战的“小飞侠”们为武汉捐款捐物。<br />
<br />
无奈的是很多人竟认为这与肖战无关,不断指责谩骂肖战。<br />
<br />
那些说话不负责任的键盘侠可曾想过,正是因为肖战超强的号召力,小飞侠们才团结一致,和偶像一同进步,成为最好的自己!<br />
<br />
武汉疫情牵动数万中国人的心,在援助武汉的过程中,很多新生代艺人发挥了他们超强的影响力和号召力,这才应该是大家关注焦点,而不是道德绑架,无意义的攀比。#娱乐最前沿#<br />
<table><tr><td><img src="http://pics0.baidu.com/feed/3801213fb80e7bec8452feb4ec529d3e9a506b5a.jpeg?token=d894eb7dbd20433ef1f32cee1417c72c&s=38925CDEC41259D4C69FBAB90300101A" border=0></td><td><img src="http://pics0.baidu.com/feed/94cad1c8a786c917275f1bcd0a4154c93ac7576c.jpeg?token=7a1e0c10b5815d46ff118cfd3030b98a&s=8811C7101D4A44C85640E4C90300B0B3" border=0></td><td><img src="http://pics0.baidu.com/feed/a50f4bfbfbedab648d670745344a8bc578311ea4.jpeg?token=456c456ae52687b62572daba95933d54&s=A3A19A0954035EEF361C299F0300D0A3" border=0></td></tr></table>

结果:

<think>我们使用OpenCV的`cv2.imshow()`函数来显示图像,但默认情况下每个窗口只能显示一张图像。 为了在同一窗口中显示两张图片并排,我们可以将两张图片水平拼接成一张大图,然后显示这张大图。 步骤: 1. 读取两张图片。 2. 确保两张图片的高度相同(如果不同,需要调整其中一张图片的高度以匹配另一张,但通常我们保持原比例或进缩放)。 3. 使用`np.hstack()`函数将两张图片水平拼接。 4. 显示拼接后的图片。 注意:如果两张图片的通道数不同(比如一张是彩色,一张是灰度),需要先统一通道数(例如将灰度图转换为彩色图,或者反过来,取决于需求)。 另外,如果两张图片的尺寸(高度)不同,我们需要先调整其中一张图片的高度以匹配另一张。这里我们假设我们希望保持原始比例,所以需要调整宽度和高度,但并排显示通常要求高度相同,宽度可以不同。不过,`np.hstack`要求两张图片在除了宽度(第二个维度)以外的所有维度都相同。因此,我们需要将两张图片调整为相同的高度。 但有时候,我们可能不想改变原始图片的宽高比,那么我们可以先调整两张图片的高度一致(通过缩放,同时按比例调整宽度),然后再水平拼接。或者,我们可以在两张图片高度不一致时,在高度较小的图片上下填充黑色(或白色)区域,使它们高度相同,然后拼接。 这里给出两种方法: 方法1:缩放图片至相同高度(保持宽高比) 方法2:填充至相同高度(不改变图片内容,只填充边界) 根据用户需求,我们可能选择其中一种。这里我们展示两种方法,但先给出一个简单的假设:两张图片高度相同,或者我们直接缩放至相同高度(不保持宽高比,因为并排显示时高度必须一样,但这样可能会变形)?或者保持宽高比缩放至相同高度,同时宽度按比例调整,然后填充宽度使两张图片宽度也相同?但用户要求并排显示,所以宽度可以不同,高度必须相同。 所以,如果两张图片高度不同,我们可以按比例缩放其中一张(或两张都缩放)到相同高度,同时宽度按比例缩放,这样不会变形。然后水平拼接。 但用户没有说明是否要保持宽高比,所以我们先给出一个简单的版本:要求两张图片高度相同,如果不相同,则按比例缩放至相同高度(这样不会变形),然后拼接。 然而,另一种更简单的方法是:直接调整两张图片到相同的高度(通过缩放),然后水平拼接。注意,缩放可能导致变形,所以最好保持宽高比缩放,然后填充黑色到目标高度和宽度(但这里我们只需要高度相同,宽度按比例调整,所以不需要填充宽度,因为水平拼接允许宽度不同)。 但是,`np.hstack`要求两张图片的高度(数)完全相同,通道数也要相同。所以: 步骤细化: 1. 读取图片1和图片2。 2. 获取两张图片的高度h1和h2,然后确定目标高度(比如取最大高度,或者最小高度,或者固定一个值?)。这里我们可以取最大高度,然后将较小的图片按比例缩放至这个高度,同时宽度按比例缩放。 3. 调整图片:将两张图片调整到相同的高度(保持宽高比缩放)。 4. 检查通道数:如果一张是彩色(3通道),一张是灰度(1通道),则将灰度图转换为彩色图(即复制三个通道)。 5. 使用`np.hstack`水平拼接。 6. 显示拼接后的图片。 但是,用户可能希望原样显示,不进缩放(即图片原始尺寸)。如果两张图片高度不同,直接拼接会出错。所以我们必须确保高度相同。 因此,我们采用以下策略: 如果两张图片高度不同,则按比例缩放图片2到图片1的高度(或者反过来),这样两张图片高度就相同了。缩放时,我们使用`cv2.resize`函数,并指定目标高度,宽度按比例计算。 但是,用户可能希望两张图片都缩放到一个统一的高度,比如取平均高度?或者取最大高度?这里我们选择将两张图片都缩放到其中较大的高度(这样不会丢失信息,但会导致图片变大,如果原始图片很大,窗口可能显示不下)。或者,我们也可以将两张图片都缩放到其中较小的高度(这样图片会变小,但不会超出窗口)。这里我们选择将两张图片都调整到其中较大的高度,但是这样可能会导致图片过大,所以我们也可以设置一个最大高度限制。但为了简单,我们先不考虑限制。 另一种做法:将两张图片调整到相同高度,这个高度可以是用户指定的,也可以是两张图片中最大的高度。然后对高度较小的图片缩放(保持宽高比)到目标高度,同时计算按比例缩放后的宽度,然后进缩放。 但是,注意:缩放后两张图片的高度相同,但宽度是各自按比例调整的,所以拼接后的大图宽度为两张图片缩放后宽度之和。 代码步骤: 1. 读取图片 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') 2. 设定目标高度为两张图片高度的最大值 target_height = max(img1.shape[0], img2.shape[0]) 3. 调整图片1和图片2到目标高度(保持宽高比) 对于每张图片,计算缩放比例:scale = target_height / original_height 然后新的宽度 = int(original_width * scale) 使用cv2.resize进缩放 4. 如果其中一张图片是灰度图,转换为彩色图(如果另一张是彩色) 判断通道数:img1.shape[2]和img2.shape[2](注意:灰度图只有两个维度,所以我们可以先检查维度数) 5. 水平拼接:hstack_img = np.hstack((img1_resized, img2_resized)) 6. 显示:cv2.imshow('Two Images', hstack_img) 但是,上述方法将两张图片都放大了,如果原始图片很大,放大后可能超出屏幕。所以我们可以选择将目标高度设置为两者中较小的高度,这样图片会缩小,但不会超出屏幕。或者,我们可以设置一个固定高度(比如800像素),将两张图片都按比例缩放到这个高度。 用户没有具体要求,我们这里选择将目标高度设为两张图片高度的最大值,但如果最大值太大(比如超过屏幕高度),我们可以限制最大高度(比如800)。但为了简单,我们先不考虑限制。 另外,如果两张图片的通道数不一致,我们可以将灰度图转换为彩色图。注意:OpenCV读取的彩色图是BGR格式,三通道;灰度图是单通道。 转换灰度图为彩色图:使用`cv2.cvtColor(gray_img, cv2.COLOR_GRAY2BGR)` 但是,我们也可以将彩色图转换为灰度图,但用户可能希望看到彩色?所以这里我们统一为彩色图:如果一张是彩色,另一张是灰度,则将灰度图转彩色图。 下面我们写一个函数来实现: 注意:如果两张图片都是灰度图,也可以直接拼接,但拼接后还是单通道,显示时需要用灰度方式显示(但OpenCV的imshow会自动处理,单通道显示为灰度,三通道显示为彩色)。不过,为了统一,我们可以将两张灰度图都转为彩色图(虽然这样显示效果一样,但通道数就变成了3,这样拼接后是3通道)。或者,我们也可以不转换,直接拼接单通道图(但要求两张都是单通道)。所以,我们处理如下: 步骤: - 如果两张图片都是单通道,那么保持单通道(或者都转为彩色图?为了简单,我们保持单通道,因为拼接后也是单通道,可以正常显示)。 - 如果一张是三通道,一张是单通道,则将单通道的那张转换为三通道。 - 如果一张是三通道,一张是其他通道数(比如4通道,带透明度),则需要转换为三通道(去掉透明度或合并)。 但一般情况下,我们处理的是灰度或BGR三通道。所以这里我们只考虑这两种。 代码: 注意:如果图片加载失败,需要处理。 下面我们写代码: 但是,用户要求并排显示,我们也可以不缩放,而是采用填充的方式,使两张图片具有相同的高度。这样不会变形,但会有黑边。这里我们也给出填充的方法: 方法2:填充方法 目标高度 = max(h1, h2) 对于高度较小的图片,我们在上下填充黑色(或白色)像素,使高度等于目标高度。填充时,宽度不变,高度增加到目标高度,上下平均填充(如果无法平均,则上多一点或少一点都可以)。 步骤: new_img = np.zeros((target_height, width, channels), dtype=img.dtype) # 计算填充的上下边界 top = (target_height - h) // 2 bottom = target_height - h - top new_img[top:top+h, :, :] = img 然后,两张图片都填充到相同的高度(如果某张图片高度已经等于目标高度,则不需要填充),然后水平拼接。 两种方法都可以,这里我们选择填充的方法,因为不会变形。但用户可能希望无黑边?所以我们可以根据用户需求选择。这里我们实现填充的方法。 由于用户没有明确,我们这里实现填充的方法,这样图片内容不会被缩放变形。 具体步骤: 1. 读取两张图片。 2. 确定目标高度:取两张图片高度的最大值。 3. 对于每张图片: 如果高度小于目标高度,则进上下填充,使高度等于目标高度。 如果高度等于目标高度,则不做处理。 如果高度大于目标高度?不可能,因为目标高度是最大值。所以忽略。 4. 统一通道数(如前所述)。 5. 水平拼接。 代码实现: 注意:填充时,左右不需要填充,只填充上下。 使用`cv2.copyMakeBorder`函数可以方便地填充。 例如: img1_padded = cv2.copyMakeBorder(img1, top1, bottom1, 0, 0, cv2.BORDER_CONSTANT, value=(0,0,0)) 其中,top1 = (target_height - h1) // 2, bottom1 = target_height - h1 - top1 同样处理img2。 然后拼接:np.hstack((img1_padded, img2_padded)) 下面我们写代码: 但是,如果两张图片都是彩色图,则value应该是一个三元组,如(0,0,0)表示黑色。如果是灰度图,则value是一个标量0。但我们已经统一通道数,所以可以按照三通道来处理。 因此,我们可以先统一通道数,然后再填充,这样填充的颜色值就可以统一为(0,0,0)(黑色)或者你想要的背景色。 步骤调整: 1. 读取图片,并检查是否读取成功。 2. 统一通道数(将灰度图转为彩色图)。 3. 确定目标高度。 4. 对每张图片上下填充,使高度等于目标高度。 5. 水平拼接。 6. 显示。 代码示例:</think>在 Python 中使用 OpenCV 将两张图片并排显示在同一窗口,可以通过以下步骤实现: ### 解决方案 ```python import cv2 import numpy as np # 1. 读取两张图片 img1 = cv2.imread('image1.jpg') # 替换为你的第一张图片路径 img2 = cv2.imread('image2.jpg') # 替换为你的第二张图片路径 # 2. 确保图片高度一致(调整第二张图片高度匹配第一张) if img1.shape[0] != img2.shape[0]: # 计算缩放比例并调整img2高度 scale = img1.shape[0] / img2.shape[0] img2 = cv2.resize(img2, (int(img2.shape[1]*scale), img1.shape[0])) # 3. 水平拼接图片 combined = np.hstack((img1, img2)) # 4. 显示结果 cv2.imshow('Side by Side Images', combined) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 关键说明: 1. **高度对齐**:使用 `cv2.resize()` 调整第二张图片高度匹配第一张,保持宽高比 - 公式:缩放比例 $ \text{scale} = \frac{h_1}{h_2} $,新宽度 $ w_2' = w_2 \times \text{scale} $ 2. **水平拼接**:`np.hstack()` 实现水平拼接,要求两张图片: - 相同高度(已通过步骤2保证) - 相同通道数(彩色图3通道,灰度图1通道) 3. **通道处理**(如果图片类型不同): ```python # 若img1是彩色,img2是灰度图,需转换 if len(img1.shape) == 3 and len(img2.shape) == 2: img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR) ``` ### 示例效果 输入图片1(300×400)和图片2(200×300),输出为: - 高度统一为300像素 - 总宽度 = 400 + 300×1.5 = 850像素 - 显示窗口标题:"Side by Side Images" ### 其他应用场景 此技术还可用于: 1. 图像处理前后对比 2. 多摄像头画面拼接 3. 特征点匹配可视化(如引用[2]中的特征点对比) 4. 颜色空间比较(如引用[3]的HSV/BGR对比)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值