#!/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(四个字节大小且带符号的整型),单看a
和img
发现不了问题,回到上面的报错,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