首页 > 其他分享 >tiff转图片

tiff转图片

时间:2023-12-11 11:48:23浏览次数:23  
标签:img tiff image cv2 file resize 图片

tiff转图片jpg/png

存在的问题

  1. 原博客程序内存占用过大,部署在docker后容器异常重启,故修改dtype为float16减小内存占用。

  2. chrome浏览器图片显示存在对像素点数量的限制,超出指定大小则图片加载失败,故需要对图片进行缩小,降低像素点数量。

  3. 参考博客无灰度图转化方法,本文在搜集多方资料后进行补充。

  4. jpg图像为3通道,背景颜色显示为黑色。若要去黑框,将图片黑色背景改为透明,则需要保存图片为png格式,将3通道转为4通道(添加透明通道)。

  5. 生成的png图片文件太大,前端展示速度较慢,故需压缩图片,使网页端能够快速预览。

opencv2实现

tiff转jpg

import cv2
import numpy as np

from skimage import io
from loguru import logger


def tiff2jpg(tiff_file_path, jpg_file_path, scale=0.3):
    """
    将tiff文件转为jpg图片
    :param tiff_file_path: tiff文件路径
    :param jpg_file_path: 生成的图片路径
    :param scale: 图像缩放比例
    """
    logger.info("开始生成缩略图")
    try:
        img = io.imread(tiff_file_path)  # 读取文件名
        logger.info(f"图片尺寸: {img.shape}; 数据类型: {img.dtype}")  # 显示图片大小和类型
        img = np.divide(img, img.max(), dtype=np.float16)  # 使其所有值不大于一
        img = img * 255 - 0.001  # 减去0.001防止变成负整型
        img = img.astype(np.uint8)  # 强制转换成8位整型
        if len(img.shape) == 3:
            height, width, _ = img.shape
            img_resize = cv2.resize(img, dsize=(round(width * scale), round(height * scale)))
            b = img_resize[:, :, 0]    # 读取蓝通道
            g = img_resize[:, :, 1]    # 读取绿通道
            r = img_resize[:, :, 2]    # 读取红通道
            rgb_img = cv2.merge([r, g, b])  # 通道拼接
            cv2.imwrite(jpg_file, rgb_img)  # 保存图像
        elif len(img.shape) == 2:
            height, width = img.shape
            img_resize = cv2.resize(img, dsize=(round(width * scale), round(height * scale)))
            rgb_image = cv2.cvtColor(img_resize, cv2.COLOR_GRAY2RGB)
            b = rgb_image[:, :, 0]  # 读取蓝通道
            g = rgb_image[:, :, 1]  # 读取绿通道
            r = rgb_image[:, :, 2]  # 读取红通道
            rgb_img = cv2.merge([r, g, b])  # 通道拼接
            cv2.imwrite(jpg_file_path, rgb_img)  # 保存图像

        logger.info(f"生成缩略图成功: {jpg_file_path}")
    except Exception as e:
        logger.error(f"生成缩略图失败: {e}")

tiff转png

import cv2
import numpy as np

from skimage import io
from loguru import logger


def tiff2png(tiff_file_path, png_file_path, scale=0.3):
    """
    将tiff文件转为png图片
    :param tiff_file_path: tiff文件路径
    :param png_file_path: 生成的图片路径
    :param scale: 图像缩放比例
    """
    logger.info("开始生成缩略图")
    try:
        img = io.imread(tiff_file_path)  # 读取文件名
        logger.info(f"图片尺寸: {img.shape}; 数据类型: {img.dtype}")  # 显示图片尺寸和类型
        img = np.divide(img, img.max(), dtype=np.float16)  # 使其所有值不大于1
        img = img * 255 - 0.001  # 减去0.001防止变成负整型
        img = img.astype(np.uint8)  # 强制转换成8位整型
        if len(img.shape) == 3:
            height, width, _ = img.shape
            # 注意顺序: width, height
            img_resize = cv2.resize(img, dsize=(round(width * scale), round(height * scale)))
            b = img_resize[:, :, 0]    # 读取蓝通道
            g = img_resize[:, :, 1]    # 读取绿通道
            r = img_resize[:, :, 2]    # 读取红通道
            rgb_img = cv2.merge([b, g, r])  # 通道拼接
            # 三通道转四通道,设置黑色为透明
            gray_image = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
            _, alpha = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY)
            rgba_image = cv2.merge([b, g, r, alpha], 4)
            # 如需轮廓识别,可添加代码在此处
            # 保存图像,极限压缩
            cv2.imwrite(png_file_path, rgba_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
        elif len(img.shape) == 2:
            height, width = img.shape
            # 注意顺序: width, height
            img_resize = cv2.resize(img, dsize=(round(width * scale), round(height * scale)))
            rgb_image = cv2.cvtColor(img_resize, cv2.COLOR_GRAY2RGB)
            b = rgb_image[:, :, 0]  # 读取蓝通道
            g = rgb_image[:, :, 1]  # 读取绿通道
            r = rgb_image[:, :, 2]  # 读取红通道
            _, alpha = cv2.threshold(img_resize, 0, 255, cv2.THRESH_BINARY)
            rgba_image = cv2.merge([b, g, r, alpha], 4)
            # 保存图像,极限压缩
            cv2.imwrite(png_file_path, rgba_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

        logger.info(f"生成缩略图成功: {png_file_path}")
    except Exception as e:
        logger.error(f"生成缩略图失败: {e}")

轮廓识别

# 识别轮廓,裁剪图像
contours, _ = cv2.findContours(alpha, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(contours[0])
# 绘制轮廓
cv2.drawContours(dst, contours, 0, (0, 0, 255), 5)
# 提取图像范围
cropped_image = dst[y:y + h, x:x + w]

pillow实现

需要注意的是,此方法并不通用,经测试只有GF3系列可用。

tiff转jpg

# 读取tiff文件
tif_image = Image.open(tiff_file_path)
# 转换为RGB格式
rgb_image = tif_image.convert("RGB")
# 保存图像
rgb_image.save(jpg_file_path)

tiff转png

# 读取tiff文件
tif_image = Image.open(tiff_file_path)
# 转换为RGB格式
rgb_image = tif_image.convert("RGB")
# 创建alpha通道
_, alpha = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)
# 通道分离
r, g, b = rgb_image.split()
# 将ndnaary类型转化为IMAGE类型
a = Image.fromarray(alpha)
# 通道融合
rgba_image = Image.merge("RGBA", [r, g, b, a])
# 图像尺寸
height, width = img.shape
# 图像等比例缩小
image_resize = rgba_image.resize((round(width * scale), round(height * scale)), Resampling.NEAREST)
# 获取图像的边界框
bbox = image_resize.getbbox()
# 裁剪图像,删除黑色边框
cropped_image = image_resize.crop(bbox)
# 保存为jpg图像
image_resize.save(png_file_path)

参考博客

  1. python将.tif格式图批量转化为.jpg格式图_python tif转jpg-CSDN博客

  2. OpenCV-Python教程:通道分离、通道合并(split、merge) – 桔子code (juzicode.com)

  3. Python 旋转图像并裁剪黑边|极客教程 (geek-docs.com)

  4. 【OpenCV】将图片黑色背景变成透明背景_opencv把黑色背景换成透明-CSDN博客

  5. python CV2中shape和resize返回值和参数的区别_cv2.shape-CSDN博客

  6. cv2.findContours() 轮廓检测_cv2.findcontours所有点-CSDN博客

  7. python cv2 改变图片黑色背景改为透明_mob64ca12e95b2b的技术博客_51CTO博客

  8. 3.4. 使用 Pillow 处理图像:通道 — Python笔记 文档 (osgeo.cn)

  9. Python图片处理模块PIL操作方法(pillow)-腾讯云开发者社区-腾讯云 (tencent.com)

标签:img,tiff,image,cv2,file,resize,图片
From: https://www.cnblogs.com/alphapy/p/17894012.html

相关文章

  • PDF转化为图片
    Java类PDF2Image在包com.oncloudsoft.zbznhc.common.util.pdf中是用来将PDF文件转换为图像的。它使用了ApachePDFBox库来处理PDF文档并生成图像。下面是类中每个部分的详细解释:类和方法说明类PDF2Image:使用了Lombok库的@Slf4j注解,这会为类自动生成一个日志记录器......
  • js(canvas) 图片压缩
    1functioncompress(url,width,height){2returnnewPromise((resolve,reject)=>{3letimg=document.createElement('img')4img.onload=()=>{5letw=width6leth=img.naturalH......
  • Home-图片懒加载指令实现
    场景和指令用法场景:某些网站首页通常会很长,用户不一定能访问到页面靠下面的图片,这类图片通过懒加载优化手段可以做到,只有进入视口区域才发送图片请求指令用法:<imgv-img-lazy="item.picture"/>在图片img身上绑定指令,该图片只有正式进入到视口区域时才会发送图片网络请求实现......
  • 已删除但未消失的图片(Excel与WPS切换时产生的问题)
    问题:一个完全空的工作簿为何会非常大?问题分析:将工作簿后缀名改成rar,打开..xl/media,可以看到有很多图片,这些图片造成了文件大。进一步的问题:这些图片哪里来的,藏在何处。过程:这是Excel与WPS操作同一工作簿产生的问题。第一步:使用WPS打开工作簿,在其中插入嵌入到单元格的图片第......
  • 逻辑视图模型建模图片
                          ......
  • css:两个行内块元素和图片垂直居中对齐
    (目录)两个行内块元素垂直居中对齐先看一段代码:<style>.box{width:200px;height:200px;line-height:200px;font-size:20px;text-align:center;display:inline-block;background-color:green;}</style><divclass="box&q......
  • MFC CStatic 里面加载图片
    ▲效果头文件新增空间指针:private:CStatic*pBMP;BOOLCMFCApplicationBMPDlg::OnInitDialog()里面初始化://TODO:在此添加额外的初始化代码//初始化字段pBMP=(CStatic*)GetDlgItem(IDC_STATIC_BMP);//除了添加控件,还有这种方式获得控件的方式。pBMP->Mod......
  • Windows 11 cmd命令行修改背景色、设置指定图片、桌面背景
    前言全局说明Windows11cmd命令行修改背景色、设置指定图片、桌面背景一、找到设置--外观可以自定义图片,也可以使用桌面背景图片(二选一)如果设置图片位置或高、宽,没有达到你想要的,可以在“拉伸模式”、“图像对齐”设置二、设置不透明度1.设置背景100%透明度效果......
  • 博客园作为图床,上传图片自动添加图片水印
    专属于博客园的教程。markdown上传图片,添加图片水印,再上传到博客园图床。前言图床有防盗链什么的,处理起来实在是麻烦。既然博客园支持图床,我现在只在博客园写,那就捣鼓了一下。今天是通义千问工程师。菜鸡啥也不会。参考教程首先应参考教程配置,保证博客园图床正确,再对python......
  • Android阅读器之文本、图片和表格测量
    文章摘要本文将介绍如何在Android开发中实现文本、图片和表格的测量。我们将使用AndroidStudio和Java语言,并利用AndroidSDK中的相关类库。正文文本测量在Android中,可以使用Paint类和getTextBounds()方法来测量文本。首先,需要创建一个Paint对象,然后设置字体、颜色等属性。接下来,调......