python实现灰度图像每个像素的灰度值为1个字节(8位),按照从低到高记为L1、L2、…、L8。将灰度图像I1中每个像素的L1、L2、…、L8分别用二值图像I2的L1、L2、……、L8替换,用numpy对计算进行优化,保存替换后的8个图像
时间: 2023-07-10 21:07:01 浏览: 70
以下是代码实现:
```python
import numpy as np
from PIL import Image
# 加载灰度图像
img_gray = Image.open("gray_img.png").convert("L")
img_gray_arr = np.array(img_gray)
# 将灰度值转换为二进制
binary_arr = np.unpackbits(img_gray_arr.reshape((*img_gray_arr.shape, 1)), axis=2)
# 生成8个二值图像
binary_imgs = [binary_arr[..., i] for i in range(8)]
# 加载并保存8个二值图像
for i in range(8):
img_binary = Image.fromarray(binary_imgs[i].astype(np.uint8) * 255)
img_binary.save(f"binary_img_{i+1}.png")
```
这里假设灰度图像为`gray_img.png`,并且已经转换为灰度模式。代码首先将灰度值转换为二进制,然后分别提取出每一位二进制值,生成8个二值图像。最后将8个二值图像保存为`binary_img_1.png`到`binary_img_8.png`。
相关问题
python实现灰度图像每个像素的灰度值为1个字节(8位),按照从低到高记为L1、L2、…、L8。将灰度图像I1中每个像素的L1、L2、…、L8分别用二值图像I2的替换,用numpy对计算进行优化,保存8个图像
好的,我可以帮你实现。首先,我们需要将灰度图像转成二值图像。这可以通过阈值分割实现。接着,我们需要将每个像素的L1、L2、…、L8分别提取出来,然后根据阈值将其转成0或1。最后,将每个二值图像保存下来即可。
以下是实现代码:
```python
import cv2
import numpy as np
# 读取灰度图像
img = cv2.imread('gray_image.jpg', 0)
# 阈值分割得到二值图像
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 将每个像素的L1、L2、…、L8分别提取出来,并转成0或1
bits = [cv2.threshold((img >> i) & 1, 0, 1, cv2.THRESH_BINARY)[1] for i in range(8)]
# 保存每个二值图像
for i in range(8):
cv2.imwrite(f'bit{i+1}.jpg', bits[i])
```
其中,`img`表示原灰度图像,`ret`和`thresh`分别表示阈值和二值图像,`bits`是一个包含8个二值图像的列表,每个二值图像对应一个像素的L1、L2、…、L8。最后,我们使用`cv2.imwrite`将每个二值图像保存下来。
注意:上述代码假设灰度图像中每个像素的灰度值为8位(即1个字节),如果不是8位,需要根据实际情况修改代码。
python实现灰度图像每个像素的灰度值为1个字节(8位),按照从低到高记为L1、L2、…、L8。将图像I1中每个像素的L1、L2、…、L8分别用图像I2的替换,用numpy对计算进行优化
可以使用如下代码实现:
```python
import cv2
import numpy as np
# 读取图像I1和I2
img1 = cv2.imread('I1.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('I2.png', cv2.IMREAD_GRAYSCALE)
# 将每个像素的灰度值拆分成8个二进制位
bits = np.unpackbits(img1, axis=1)
# 将I2中每个像素的灰度值也拆分成8个二进制位
bits2 = np.unpackbits(img2, axis=1)
# 将I2中每个像素的L1~L8替换为I1中对应像素的L1~L8
bits2 = np.concatenate((bits[:, :24], bits2[:, 24:]), axis=1)
# 将二进制位重新组合成灰度值
img2 = np.packbits(bits2, axis=1)
# 保存结果
cv2.imwrite('result.png', img2)
```
上述代码中,`np.unpackbits()`函数可以将每个像素的灰度值拆分成8个二进制位,返回一个形状为`(height, width, 8)`的数组。`np.concatenate()`函数将两个数组按列拼接起来,即将I2中每个像素的L1~L8替换为I1中对应像素的L1~L8。最后,`np.packbits()`函数将二进制位重新组合成灰度值。这种方式使用numpy进行计算,效率较高。
阅读全文