pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...
創建矩陣
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]])
如果在創建的時候沒有指定數據類型,那么默認是int32
強制類型轉換
方法一:
b.dtype=np.uint8
雖然dtype變了,但是shape也變了,再看看里面的數據
除了原先的數據,又添加了新的數據0
方法二:astype
對c這個對象做astype這個操作
c.astype(np.uint8)
Out[11]:
array([[50, 55, 60],
[65, 70, 75],
[80, 85, 90]], dtype=uint8)
這樣就是期望的結果了。
不同數據類型之間的運算
1.int32+uint8=int32
f=c+d
2.uint8+float32=float32
g=d+e
cv2和plt顯示矩陣的數據類型
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的窗口很小,就不截圖了。
浮點型
1.簡單例子
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))
對于float32,float64。cv2顯示都是一片空白
但是:
cv2.imshow('1',img1.astype(np.uint8))
可見:
cv2的顯示只能顯示uint8
數據溢出
數據類型:https://www.runoob.com/numpy/numpy-dtype.html
d矩陣是有c矩陣int32強制類型轉化成的,數據類型是uint8,說明范圍是0~255
通過賦值,觀察console臺中的數據變化發現
超過255的,從0開始,循環始終是從0到255
輸入255對應255,輸入256對應0,輸入257對應1,輸入365對應365-256=109,輸入900對應900-256*2=132
輸入-256對應0,-255對應1,-257對應255
如果從int32轉換成uint8,是不是如上的數值結果呢?
c[0,:]=[256,365,900];c[1,:]=[-256,-255,-257]
d=c.astype(np.uint8)
結果與上述分析相同
總結:
在規定的數據類型下有一個數據范圍,超過數據范圍的數則從這個范圍的最小開始重新計數
圖像線性增強
1.對像素直接加上或減去一個數值
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是在正常的范圍內,因為原圖像素的最大是37,最小是17
而加減50就會出現原來是白,變成黑,原來是黑又變成白的情況,因為原圖Lina是uint8格式,新構建的矩陣a也是uint8,所以結果也是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
# #直接對像素加上一個實數來對圖像的亮度進行一個整體的提升
lina = cv2.imread('lina2.png',0)
rows,cols = lina.shape
構造數據類型是float64的常數矩陣
a=np.ones((rows,cols))
默認類型是float64
然后吧和這個float64+uint8
b=a*50+lina
plt.imshow(b,'gray')
用plt去顯示一個float6的4矩陣
得到:
構造數據類型是uint8的常數矩陣
aa=np.ones((rows,cols),dtype=lina.dtype);
bb=aa*50+lina
plt.imshow(bb,'gray')
所以說,如果想避免以上的情況的話
一開始的常數矩陣就構造float型,最后用plt顯示float型矩陣
但是…發現這么搞之后,跟原圖沒啥大的區別了
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.直接對像素乘以一個系數n來對圖像的對比度進行增加或減小,
其中n=2,n=0.5,注意灰度值超出255的區域還是以255來顯示。
import cv2
import numpy as np
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
##線性增強
#直接對像素乘以一個系數n來對圖像的對比度進行增加或減小,其中n=2,n=0.5,注意灰度值超出255的區域還是以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')
#這一步先轉成int32,再乘以2,這樣的話超過255的值會正常顯示
lina2=lina.astype(np.int32)*n2
lina2[lina2>255]=255 #超過255的設為255
plt.subplot(122);plt.title('*2')
plt.imshow(lina2,'gray')
plt.show()
總結
以上是生活随笔為你收集整理的pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos怎么切换python版本_c
- 下一篇: python 文件 解析ddl_使用py