其他分享
首页 > 其他分享> > 矩阵生成雪花噪点灰度图遇到的若干问题

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

作者:互联网

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

#!/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

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

下面来求证一下

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

标签:噪点,img,300,矩阵,np,灰度,print,type,cv
来源: https://www.cnblogs.com/Linkdom/p/16414768.html