日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...

發布時間:2025/3/19 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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强制类型转换|图像线性增强|不同数据类型与图像的显示...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。