ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-27 00:02:02  阅读:213  来源: 互联网

标签:噪点 img 300 矩阵 np 灰度 print type cv


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

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有