python数字图像处理(4):图像数据类型及颜色空间转换


一、图像数据类型及转换

在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间也可以转换。这些数据类型及取值范围如下表所示:

Data type Range
uint8 0 to 255
uint16 0 to 65535
uint32 0 to 232
float -1 to 1 or 0 to 1
int8 -128 to 127
int16 -32768 to 32767
int32 -231 to 231 - 1

一张图片的像素值范围是[0,255], 因此默认类型是unit8, 可用如下代码查看数据类型:

from skimage import io,data
img=data.chelsea()
print(img.dtype.name)

在上面的表中,特别注意的是float类型,它的范围是[-1,1]或[0,1]之间。一张彩色图片转换为灰度图后,它的类型就由unit8变成了float

1、unit8转float

from skimage import data,img_as_float
img=data.chelsea()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)

输出:

uint8
float64

2、float转uint8

from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
dst=img_as_ubyte(img)
print(dst.dtype.name)

输出:

float64
uint8

float转为unit8,有可能会造成数据的损失,因此会有警告提醒。

除了这两种最常用的转换以外,其实有一些其它的类型转换,如下表:












Function name

Description

img_as_float

Convert to 64-bit floating point.

img_as_ubyte

Convert to 8-bit uint.

img_as_uint

Convert to 16-bit uint.

img_as_int

Convert to 16-bit int.


 

二、颜色空间及其转换

如前所述,除了直接转换可以改变数据类型外,还可以通过图像的颜色空间转换来改变数据类型。

常用的颜色空间有灰度空间、rgb空间、hsv空间和cmyk空间。颜色空间转换以后,图片类型都变成了float型。

所有的颜色空间转换函数,都放在skimage的color模块内。

例:rgb转灰度图

from skimage import io,data,color
img=data.lena()
gray=color.rgb2gray(img)
io.imshow(gray)

其它的转换,用法都是一样的,列举常用的如下:

skimage.color.rgb2grey(rgb)

skimage.color.rgb2hsv(rgb)

skimage.color.rgb2lab(rgb)

skimage.color.gray2rgb(image)

skimage.color.hsv2rgb(hsv)

skimage.color.lab2rgb(lab)

 实际上,上面的所有转换函数,都可以用一个函数来代替

skimage.color.convert_colorspace(arr, fromspace, tospace)

表示将arr从fromspace颜色空间转换到tospace颜色空间。

例:rgb转hsv

from skimage import io,data,color
img=data.lena()
hsv=color.convert_colorspace(img,'RGB','HSV')
io.imshow(hsv)

在color模块的颜色空间转换函数中,还有一个比较有用的函数是

skimage.color.label2rgb(arr), 可以根据标签值对图片进行着色。以后的图片分类后着色就可以用这个函数。

例:将lena图片分成三类,然后用默认颜色对三类进行着色

复制代码
from skimage import io,data,color
import numpy as np
img=data.lena()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
    for j in range(cols):
        if(gray[i,j]<0.4):
            labels[i,j]=0
        elif(gray[i,j]<0.75):
            labels[i,j]=1
        else:
            labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)
复制代码



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼编码是一种无损的数据压缩算法,它通过将出现频率较高的字符用较短的编码表示,而将出现频率较低的字符用较长的编码表示,从而达到压缩数据的目的。在数字图像处理中,哈夫曼编码可以应用于图像压缩、图像传输等方面。 下面是使用Python实现哈夫曼编码的基本步骤: 1. 统计字符出现的频率,构建字符频率表。 2. 将字符频率表构建成哈夫曼树。 3. 对哈夫曼树进行遍历,得到每个字符的哈夫曼编码。 4. 将原始数据转换为对应的哈夫曼编码。 5. 将哈夫曼编码转换为二进制数据,最终实现数据压缩。 以下是一个简单的Python实现示例: ```python import heapq from collections import defaultdict class HuffmanCoding: def __init__(self, data): self.data = data self.heap = [] self.codes = {} self.reverse_mapping = {} class HeapNode: def __init__(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None def __lt__(self, other): return self.freq < other.freq def make_frequency_dict(self): frequency = defaultdict(int) for char in self.data: frequency[char] += 1 return frequency def make_heap(self, frequency): for char, freq in frequency.items(): node = self.HeapNode(char, freq) heapq.heappush(self.heap, node) def merge_nodes(self): while len(self.heap) > 1: node1 = heapq.heappop(self.heap) node2 = heapq.heappop(self.heap) merged = self.HeapNode(None, node1.freq + node2.freq) merged.left = node1 merged.right = node2 heapq.heappush(self.heap, merged) def make_codes_helper(self, node, current_code): if node is None: return if node.char is not None: self.codes[node.char] = current_code self.reverse_mapping[current_code] = node.char return self.make_codes_helper(node.left, current_code + "0") self.make_codes_helper(node.right, current_code + "1") def make_codes(self): root = heapq.heappop(self.heap) current_code = "" self.make_codes_helper(root, current_code) def get_encoded_data(self): encoded_data = "" for char in self.data: encoded_data += self.codes[char] return encoded_data def pad_encoded_data(self, encoded_data): extra_padding = 8 - len(encoded_data) % 8 for i in range(extra_padding): encoded_data += "0" padded_info = "{0:08b}".format(extra_padding) encoded_data = padded_info + encoded_data return encoded_data def get_byte_array(self, padded_encoded_data): if len(padded_encoded_data) % 8 != 0: print("Encoded data not padded properly") exit(0) b = bytearray() for i in range(0, len(padded_encoded_data), 8): byte = padded_encoded_data[i:i+8] b.append(int(byte, 2)) return b def compress(self): frequency = self.make_frequency_dict() self.make_heap(frequency) self.merge_nodes() self.make_codes() encoded_data = self.get_encoded_data() padded_encoded_data = self.pad_encoded_data(encoded_data) byte_array = self.get_byte_array(padded_encoded_data) return byte_array ``` 使用示例: ```python data = "hello world" h = HuffmanCoding(data) compressed_data = h.compress() print("Compressed data:", compressed_data) ``` 输出结果: ``` Compressed data: bytearray(b'\xf3\x22\x8d\x3e\x8b\xd7\x8c\x0e\x8f\x22\x8d') ``` 这里得到的是一个bytearray类型的数据,这些数据就是经过哈夫曼编码压缩的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值