第一种: 将16位转换位8位的时候还保留住原来的像素值,这种只改变位数而不改变具体数值,但是超过255大小的像素会转为255,故会造成信息丢失,不推荐该方法;

#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
#include <stdio.h>
using namespace std;
using namespace cv;
int main(void) {char buff1[100];char buff2[100];Mat src;//Mat dst;src = imread("C:\\Users\\Administrator\\Desktop\\unet_2\\traindata\\case01010046_Orignal_19.png", CV_LOAD_IMAGE_UNCHANGED);Mat ff = Mat::zeros(src.rows, src.cols, CV_8UC1);for (int k = 0; k<src.rows; k++) {for (int kk = 0; kk<src.cols; kk++) {int n = src.at<ushort>(k, kk);ff.at<uchar>(k, kk) = n;}}//src.copyTo(dst);imshow("haha",ff);//waitKey(0);//imwrite("c", ff);waitKey(0);return 0;
}

第二种,先把16位的图像归一化,然后*255转成8位,这一种类最为常用,而且可视化效果好,推荐该方法;

一张16位图片保存为8位如下,(切记如果用opencv读取16位,flag字段为cv2.IMREAD_ANYDEPTH)

# -*- coding:utf8 -*-
import os
import re
import shutil
import cv2
import numpy as np
from PIL import Imagedef norm_img(img):max_v = img.max()min_v = img.min()img = (img - min_v) / (max_v - min_v)return img*255file1=r".\1false_8"
if not os.path.exists(file1):os.makedirs(file1)
path1=r".\1false_16"
list_path=os.listdir(path1)
for i in range(len(list_path)): dicom_paths=os.path.join(path1,list_path[i])img_copy=cv2.imread(dicom_paths,cv2.IMREAD_ANYDEPTH)img_copy=norm_img(img_copy)prefix=str(i).zfill(5)+'.png'cv2.imwrite(os.path.join(file1,prefix),img_copy)

可以显示

如果想保存16位的png图,最好用PIL库保存,不要用opencv!

参考链接:https://blog.csdn.net/u011764992/article/details/84501300

另外通常使用opencv读取16位并保存16位的图像有几点需要注意!

opencv使用imread读取16位图像时需要增加参数:cv2.IMREAD_UNCHANGED

这样才是读取原数据,其通道数才不会改变

image1=cv2.imread(os.path.join(img,imgs[i]),cv2.IMREAD_UNCHANGED)

opencv保存16位图像时候必须转化为该数据类型并保存为PNG等格式才行:

具体参考:http://www.sohu.com/a/318613851_823210

16位深度图像转8位灰度相关推荐

  1. labelme 标注生成24位深度图像转换为8位

    新版本的 labelme 标注完成图像后,将 json 文件转换为图像时已经转换为 8 通道图像,如下图所示: 最近在看别人程序时发现经过图像标注生成的 label 一片黑,且图像深度为 24 位,如 ...

  2. C# 图片位深度转至8位灰度图像,8位灰度图像转为1位灰度图像

    #region 二值化 #region Otsu阈值法二值化模块 /// <summary>            /// Otsu阈值            /// </summa ...

  3. 位深度讲解,opencv8位单通道和32位单通道解析

    在记录数字图像的颜色时,计算机实际是用每个像素需要的位深度来表示的,黑白二色的图像是数字图像中最简单的一种,它只有黑.白两种颜色,也就是说它的每个像素只有1位颜色,位深度是1,用2的一次幂来表示:考虑 ...

  4. 【图片位深度改变】24位深度转8位深度

    代码如下: """ 2020.09.26:alian 改变图片的位深度 """ from PIL import Image import n ...

  5. matlab修改图片位深度_BMP位图32位转为24位深度

    帮朋友做一个视频采集和基本处理功能,要求的是.bmp格式 几天下来,通过directshow进行视频采集,并抓去图片保存,按照要求进行业务处理,以前的处理程序是基于RGB24 而显示器是32位真彩色, ...

  6. 图像处理中“灰度级数”是什么?(灰度值)(位深度)(1bit=1位)

    所谓灰度级数是指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级数越多,图像层次越清楚逼真.灰度级数取决于每个像素对应的刷新存储单元的位数和显示器本身的性能.如每个象素的颜色用 ...

  7. 图像深度、像素深度和位深度

    图像深度.像素深度和位深度 图像深度 像素深度 位深 区别 小结 图像深度 数字化图像的每个像素是用一组二进制数进行描述,像素的色彩由RGB通道决定,其中包含表示图像颜色的位数称为图像深度.如灰度图像 ...

  8. C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。...

    原文:C#图片灰度处理(位深度24→位深度8) #region 灰度处理/// <summary>/// 将源图像灰度化,并转化为8位灰度图像./// </summary>// ...

  9. Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)

    Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#) Baumer工业相机 Baumer工业相机保存位深度12/16 ...

  10. 【python】查看图像位深度,改变图像位深度

    1.什么是位深度 单个像素点(一个通道)上需要用多少比特(bit)来存储数据,常见的是8位 8位,像素点的范围是0-255(256个值),[255转二进制为11111111]因此位深度是8 2.深色 ...

最新文章

  1. 【青少年编程竞赛交流】11月份微信图文索引
  2. 云信小课堂丨视频“双录”知多少?
  3. 你真敢ZAO吗?解读换脸AI “细思极恐” 的用户协议
  4. System.InvalidOperationException : 不应有 Response xmlns=''。
  5. 第一章--计算机系统知识
  6. 大额存单20万起存,一次性存入40万能得到双倍利息吗?
  7. navicat 或者workbench 无法连接127.0.0.1(61)的解决方法
  8. 无法生成部件汇总表_RFID在汽车零部件企业仓储物流中的应用
  9. Windows平台RTMP推送摄像头对接介绍
  10. Netty优雅退出机制和原理
  11. Maven的pom.xml文件详解
  12. 服务器的安全措施有哪些呢?
  13. ScheduledExecutorService:多线程任务调度
  14. HTML的图文排版,css 文章内容排版实例
  15. FA(萤火虫算法)MATLAB源码详细中文注解
  16. Excel表格统计满足两列条件的总数:countifs方法
  17. 数据库——第二章关系运算题整理
  18. 让单个单元格显示两个数据
  19. 域名解析出现错误,该如何解决?
  20. 想随时定位自己做的智能设备在哪?安排,ESP32 + HaaS Python足矣,定位还能显示在地图上哦

热门文章

  1. Swift里的CAP理论和NWR策略应用
  2. 什么是短连接,如何用 Python 生成短连接?
  3. BAT 条件判断 IF
  4. 用matlab绘制挠度图,如何绘制载荷挠度曲线图
  5. ​LeetCode刷题实战196:删除重复的电子邮箱
  6. Pytorch实现GPU和TPU运算
  7. YOLOv4中常见CV学术名词说明(三){CSP/WRC/SAT}
  8. 618什么数码产品值得入手、好评超高的数码产品排行榜
  9. html页面加文字水印
  10. 洛谷 U87052 一线天