矩阵生成雪花噪点灰度图遇到的若干问题

2022/6/27 6:23:33

本文主要是介绍矩阵生成雪花噪点灰度图遇到的若干问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

矩阵生成灰度图遇到的若干问题

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/5/13 22:23
# @Author : Linkdom
import numpy as np
import cv2.cv2 as cv
import matplotlib.pyplot as plt
a=np.random.randint(0,255,(300,300))
img=cv.imread('gary_array.jpg',0)
print(img)
cv.namedWindow('Generated gray pic',cv.WINDOW_AUTOSIZE)
cv.imshow('Generated gray pic',a)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imshow('Generated gray pic',a)处发生了这个错误src_depth != CV_16F && src_depth != CV_32S

其原因参见网上大佬的话:

  • 如果图像数据类型是8U(8位无符号),则直接显示。

  • 如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0255*256]映射到[0255]

  • 如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[01]映射到[0255](注意:原图像素值必须要归一化)

下面来求证一下

import numpy as np
import cv2.cv2 as cv
import matplotlib.pyplot as plt
a=np.random.randint(0,255,(300,300))
img=cv.imread('gary_array.jpg',0)
print(type(img))
print(img[0,0])
print(type(img[0,0]))
print(type(a))
print(a[0,0])
print(type(a[0,0]))

<class 'numpy.ndarray'> 43 <class 'numpy.uint8'> <class 'numpy.ndarray'> 160 <class 'numpy.int32'>

我们可知随便读入的图片是unsigned int 8 bit(一个字节大小,且不带符号的整型),而我们所定义的矩阵是int32(四个字节大小且带符号的整型),单看aimg发现不了问题,回到上面的报错,src_depth != CV_16F && src_depth != CV_32S指的就是两字节16位浮点数和

四字节32位有符号整型(这里不清楚为啥不匹配了,可能是int命名上的细节问题)

但解决办法也非常简单,多加一个参数就可以了

a=np.random.randint(0,255,(300,300),'uint8')

这样上面生成随机灰度点的图便可以得到我们很好看的雪花噪点图(黑白电视版雪花噪点)

下一步我们继续来一点大胆的想法,生成随机彩色(rgb)图像

img=cv.imread('rgb.jpg')
# print(img)
print(type(img))
print(img[0,0])
print(type(img[0,0]))
print(img[0,0,0])
print(type(img[0,0,0]))
cv.imshow('red',img[:,:,])
cv.waitKey(0)

<class 'numpy.ndarray'> [254 0 0] <class 'numpy.ndarray'> 255 <class 'numpy.uint8'>

细节:cv中的通道顺序是BGR,证明如下

cv.imshow('blue',img[:,:,0]) cv.waitKey(0)

cv.imshow('blue',img[:,:,1]) cv.waitKey(0)

cv.imshow('red',img[:,:,2]) cv.waitKey(0)

实不相瞒,还有种莫名的美感

知道原理后,接下来我们可以开始生成自己的随机彩图了

参考着这里的维度大小一点一点做

img=cv.imread('rgb.jpg')
print(img.shape)
print(type(img))
print(img[0,0])
print(type(img[0,0]))
print(img[0,0,0])
print(type(img[0,0,0]))
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/5/13 22:23
# @Author : Linkdom
import numpy as np
import cv2.cv2 as cv
import matplotlib.pyplot as plt
blue=np.random.randint(0,255,(300,300),'uint8')
green=np.random.randint(0,255,(300,300),'uint8')
red=np.random.randint(0,255,(300,300),'uint8')
generated_img=np.array([blue,green,red]) # 这样把三个数组直接堆在一起是不可行的我们得调整矩阵维度先
# print(generated_img)
pro=generated_img.transpose([1,2,0]) # 这是通过转置交换轴的方法来改变矩阵这里我们实现了从(3,300,300)到(300,300,3)的转变
# print(pro)
cv.namedWindow('Generated gray pic',cv.WINDOW_AUTOSIZE)
cv.imshow('Generated gray pic',pro)
cv.waitKey(0)
cv.destroyAllWindows()

(彩色电视版雪花噪点是不是更美丽了呢)

后话

这篇文章其实很早就已经完成了,由于五月初那段时间Typora终于开始收钱了有点不习惯就改用marktext来写东西,结果还是非常不习惯,后面兜兜转转又去用VScode里面的markdown插件来写东西,但就是那段时间又重新理解了GitHub这些文本的书写方式,算是有得有失吧,后来又把Typora的初始免费版本下载回来了,感觉还是这个好(但突然好像又明白了很多东西,什么东西才是自己的这种哲学思考……),今天突然想起整理一下以前的文章就把这个有趣的实现发出来,今天是暑假第二天,2022.6.26



这篇关于矩阵生成雪花噪点灰度图遇到的若干问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程