pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...
創(chuàng)建矩陣
a=np.ones((3,3),dtype=np.uint8)
b=np.arange(9).reshape((3,3))
c=np.array([[50,55,60],[65,70,75],[80,85,90]])
如果在創(chuàng)建的時(shí)候沒有指定數(shù)據(jù)類型,那么默認(rèn)是int32
強(qiáng)制類型轉(zhuǎn)換
方法一:
b.dtype=np.uint8
雖然dtype變了,但是shape也變了,再看看里面的數(shù)據(jù)
除了原先的數(shù)據(jù),又添加了新的數(shù)據(jù)0
方法二:astype
對(duì)c這個(gè)對(duì)象做astype這個(gè)操作
c.astype(np.uint8)
Out[11]:
array([[50, 55, 60],
[65, 70, 75],
[80, 85, 90]], dtype=uint8)
這樣就是期望的結(jié)果了。
不同數(shù)據(jù)類型之間的運(yùn)算
1.int32+uint8=int32
f=c+d
2.uint8+float32=float32
g=d+e
cv2和plt顯示矩陣的數(shù)據(jù)類型
d=c.astype(np.uint8)
plt.imshow(c,'gray')
Out[13]:
plt.imshow(d,'gray')
Out[14]:
plt顯示uint8和int32的效果是一樣的,都可以顯示
cv2.namedWindow('1', cv2.WINDOW_NORMAL);
cv2.imshow('1',c);
cv2.imshow('1',d);
cv2.imshow()也可以顯示uint8和int32類型的矩陣,由于矩陣過小,cv的窗口很小,就不截圖了。
浮點(diǎn)型
1.簡(jiǎn)單例子
e=np.arange(9).reshape((3,3)).astype(np.float32)
plt.imshow(e,'gray')
Out[20]:
cv2.imshow('1',e)
cv2.imshow和plt都可以顯示
2.但是如果是三通道的圖片,像素是float型,那么plt無法顯示
例如
lina=cv2.imread('lina2.png')
n1=0.5;
lina1=lina*n1
plt.imshow(lina1)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Out[9]:
plt.imshow(lina1.astype(np.float32),'gray')
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
但是,plt可以顯示單通道的float型
img=cv2.imread('lina2.png',0)
n1=0.5;n2=2
img1=img*n1
plt.imshow(img1,'gray')
lina=cv2.imread('lina2.png',0)
n1=0.5;n2=2
lina1=lina*n1
plt.subplot(121);plt.title('uint8')
plt.imshow(lina1.astype(np.uint8),'gray')
plt.subplot(122);plt.title('float64')
plt.imshow(lina1,'gray')
plt.show()
cv2
cv2.imshow('1',img1)
cv2.imshow('1',img1.astype(np.float32))
對(duì)于float32,float64。cv2顯示都是一片空白
但是:
cv2.imshow('1',img1.astype(np.uint8))
可見:
cv2的顯示只能顯示uint8
數(shù)據(jù)溢出
數(shù)據(jù)類型:https://www.runoob.com/numpy/numpy-dtype.html
d矩陣是有c矩陣int32強(qiáng)制類型轉(zhuǎn)化成的,數(shù)據(jù)類型是uint8,說明范圍是0~255
通過賦值,觀察console臺(tái)中的數(shù)據(jù)變化發(fā)現(xiàn)
超過255的,從0開始,循環(huán)始終是從0到255
輸入255對(duì)應(yīng)255,輸入256對(duì)應(yīng)0,輸入257對(duì)應(yīng)1,輸入365對(duì)應(yīng)365-256=109,輸入900對(duì)應(yīng)900-256*2=132
輸入-256對(duì)應(yīng)0,-255對(duì)應(yīng)1,-257對(duì)應(yīng)255
如果從int32轉(zhuǎn)換成uint8,是不是如上的數(shù)值結(jié)果呢?
c[0,:]=[256,365,900];c[1,:]=[-256,-255,-257]
d=c.astype(np.uint8)
結(jié)果與上述分析相同
總結(jié):
在規(guī)定的數(shù)據(jù)類型下有一個(gè)數(shù)據(jù)范圍,超過數(shù)據(jù)范圍的數(shù)則從這個(gè)范圍的最小開始重新計(jì)數(shù)
圖像線性增強(qiáng)
1.對(duì)像素直接加上或減去一個(gè)數(shù)值
import cv2
import numpy as np
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
lina = cv2.imread('lina2.png',0)
rows,cols = lina.shape
a=np.ones((rows,cols),dtype=lina.dtype)
plt.subplot(321)
plt.imshow(a*20+lina,'gray');plt.title('+20')
plt.subplot(322)
plt.imshow(a*50+lina,'gray');plt.title('+50')
plt.subplot(323)
plt.imshow(lina-a*20,'gray');plt.title('-20')
plt.subplot(324)
plt.imshow(lina-a*50,'gray');plt.title('-50')
plt.subplot(325)
plt.imshow(lina,'gray');plt.title('source')
plt.show()
加減20是在正常的范圍內(nèi),因?yàn)樵瓐D像素的最大是37,最小是17
而加減50就會(huì)出現(xiàn)原來是白,變成黑,原來是黑又變成白的情況,因?yàn)樵瓐DLina是uint8格式,新構(gòu)建的矩陣a也是uint8,所以結(jié)果也是uint8類型的。
0到255從黑到白,然后又一輪從黑到白
import cv2
import numpy as np
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# #直接對(duì)像素加上一個(gè)實(shí)數(shù)來對(duì)圖像的亮度進(jìn)行一個(gè)整體的提升
lina = cv2.imread('lina2.png',0)
rows,cols = lina.shape
構(gòu)造數(shù)據(jù)類型是float64的常數(shù)矩陣
a=np.ones((rows,cols))
默認(rèn)類型是float64
然后吧和這個(gè)float64+uint8
b=a*50+lina
plt.imshow(b,'gray')
用plt去顯示一個(gè)float6的4矩陣
得到:
構(gòu)造數(shù)據(jù)類型是uint8的常數(shù)矩陣
aa=np.ones((rows,cols),dtype=lina.dtype);
bb=aa*50+lina
plt.imshow(bb,'gray')
所以說,如果想避免以上的情況的話
一開始的常數(shù)矩陣就構(gòu)造float型,最后用plt顯示float型矩陣
但是…發(fā)現(xiàn)這么搞之后,跟原圖沒啥大的區(qū)別了
lina = cv2.imread('lina2.png',0)
rows,cols = lina.shape
#a=np.ones((rows,cols),dtype=lina.dtype)
a=np.ones((rows,cols))
plt.subplot(321)
plt.imshow(a*20+lina,'gray');plt.title('+20')
plt.subplot(322)
plt.imshow(a*5000+lina,'gray');plt.title('+5000')
plt.subplot(323)
plt.imshow(lina-a*20,'gray');plt.title('-20')
plt.subplot(324)
plt.imshow(lina-a*5000,'gray');plt.title('-5000')
plt.subplot(325)
plt.imshow(lina,'gray');plt.title('source')
plt.show()
3.直接對(duì)像素乘以一個(gè)系數(shù)n來對(duì)圖像的對(duì)比度進(jìn)行增加或減小,
其中n=2,n=0.5,注意灰度值超出255的區(qū)域還是以255來顯示。
import cv2
import numpy as np
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
##線性增強(qiáng)
#直接對(duì)像素乘以一個(gè)系數(shù)n來對(duì)圖像的對(duì)比度進(jìn)行增加或減小,其中n=2,n=0.5,注意灰度值超出255的區(qū)域還是以255來顯示。
lina=cv2.imread('lina2.png',0)
n1=0.5;n2=2
lina1=lina*n1
plt.subplot(121);plt.title('*0.5')
plt.imshow(lina1,'gray')
#這一步先轉(zhuǎn)成int32,再乘以2,這樣的話超過255的值會(huì)正常顯示
lina2=lina.astype(np.int32)*n2
lina2[lina2>255]=255 #超過255的設(shè)為255
plt.subplot(122);plt.title('*2')
plt.imshow(lina2,'gray')
plt.show()
總結(jié)
以上是生活随笔為你收集整理的pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos怎么切换python版本_c
- 下一篇: cap流程图_源码阅读笔记 BiLSTM