學(xué)習(xí) Python 你必須了解的 lenna 小姐姐

lenna 小姐姐作為圖像領(lǐng)域中的 hello world,20 世紀(jì)的跨界達(dá)人,幾代人的戰(zhàn)斗對象。
對于入門 Python 的你,如果了解了 lenna 小姐姐,那可相當(dāng)于半根腳趾頭踏入了圖像處理的大門,所以今天從下面幾個方面給大家介紹一下 lenna 小姐姐
lenna是誰?
為什么選這張圖?
都對lenna做了什么?
lenna近照
lenna是誰?
萊娜·瑟德貝里(瑞典文:Lena Soderberg),1951年3月31日出生于瑞典,在1972年11月期的《花花公子》雜志中,她化名為萊娜·舍布洛姆,成為了當(dāng)期的玩伴女郎。
她的照片(即萊娜圖)后來被數(shù)字圖像處理領(lǐng)域所廣泛使用。
為什么選這張圖?
主要有三個原因
這張圖適度的混合了細(xì)節(jié)、平滑區(qū)域、陰影和紋理,從而能很好的測試各種圖像處理算法 這張圖的Lena是個美女,對于圖像處理界的研究者(大部分都是男性)來說,美女圖可以有效的吸引他們來做研究 該照片的全圖實在太吸引眼球,廣為流傳的圖僅為全圖的1/3,(全圖這里實在放不了,一放就封號)
都對lenna做了什么?
通過cv2包,科研人員對這張圖無所不用其極,繪圖顯示、切分、濾鏡、校正、旋轉(zhuǎn)、變換,行哥這里將源碼和結(jié)果一一附上
1.灰度顯示

img_gray?=?cv2.imread('lenna.jpg',0)
cv2.imshow('lenna',?img_gray)
#?判斷鍵盤按鍵
key?=?cv2.waitKey()
if?key?==?27:
????cv2.destroyAllWindows()
2.截圖顯示

img_crop?=?img[0:100,?0:200]
cv2.imshow('lena_crop',img_crop)
#?判斷鍵盤按鍵???如果是27?esc?則退出游戲
key?=?cv2.waitKey()
if?key?==?27:
????cv2.destroyAllWindows()
3.RGB轉(zhuǎn)換

B,G,R?=?cv2.split(img)
cv2.imshow('B',B)
cv2.imshow('G',R)
cv2.imshow('R',R)
key?=?cv2.waitKey()
if?key?==?27:
????cv2.destroyAllWindows()
4.加入濾鏡

def?random_light_color(img):
????#?brightness
????B,?G,?R?=?cv2.split(img)
????b_rand?=?random.randint(-50,?50)
????if?b_rand?==?0:
????????pass
????elif?b_rand?>?0:
????????lim?=?255?-?b_rand
????????B[B?>?lim]?=?255
????????B[B?<=?lim]?=?(b_rand?+?B[B?<=?lim]).astype(img.dtype)
????elif?b_rand?0:
????????lim?=?0?-?b_rand
????????B[B?0
????????B[B?>=?lim]?=?(b_rand?+?B[B?>=?lim]).astype(img.dtype)
????g_rand?=?random.randint(-50,?50)
????if?g_rand?==?0:
????????pass
????elif?g_rand?>?0:
????????lim?=?255?-?g_rand
????????G[G?>?lim]?=?255
????????G[G?<=?lim]?=?(g_rand?+?G[G?<=?lim]).astype(img.dtype)
????elif?g_rand?0:
????????lim?=?0?-?g_rand
????????G[G?0
????????G[G?>=?lim]?=?(g_rand?+?G[G?>=?lim]).astype(img.dtype)
????r_rand?=?random.randint(-50,?50)
????if?r_rand?==?0:
????????pass
????elif?r_rand?>?0:
????????lim?=?255?-?r_rand
????????R[R?>?lim]?=?255
????????R[R?<=?lim]?=?(r_rand?+?R[R?<=?lim]).astype(img.dtype)
????elif?r_rand?0:
????????lim?=?0?-?r_rand
????????R[R?0
????????R[R?>=?lim]?=?(r_rand?+?R[R?>=?lim]).astype(img.dtype)
????img_merge?=?cv2.merge((B,?G,?R))
????#img?=?cv2.cvtColor(final_hsv,?cv2.COLOR_HSV2BGR)
????return?img_merge
img_random_color?=?random_light_color(img)
cv2.imshow('img_random_color',?img_random_color)
key?=?cv2.waitKey()
if?key?==?27:
????cv2.destroyAllWindows()
5.gamma校正

def?adjust_gamma(image,?gamma=1.0):
????invGamma?=?1.0?/?gamma
????table?=?[]
????for?i?in?range(256):
????????table.append(((i?/?255.0)?**?invGamma)?*?255)
????table?=?np.array(table).astype("uint8")
????return?cv2.LUT(img_dark,?table)
img_dark?=?cv2.imread('material/lenna.jpg')
cv2.imshow('img_dark',?img_dark)
img_brighter?=?adjust_gamma(img_dark,?2)
cv2.imshow('img_dark',?img_dark)
cv2.imshow('img_brighter',?img_brighter)
key?=?cv2.waitKey()
if?key?==?27:
????cv2.destroyAllWindows()
6.圖像旋轉(zhuǎn)

M?=?cv2.getRotationMatrix2D((img.shape[1]?/?2,?img.shape[0]?/?2),?30,?1)??#?center,?angle,?scale
img_rotate?=?cv2.warpAffine(img,?M,?(img.shape[1],?img.shape[0]))
cv2.imshow('rotated?lenna',?img_rotate)
key?=?cv2.waitKey(0)
if?key?==?27:
????cv2.destroyAllWindows()
7.仿射變換

rows,?cols,?ch?=?img.shape
pts1?=?np.float32([[0,?0],?[cols?-?1,?0],?[0,?rows?-?1]])
pts2?=?np.float32([[cols?*?0.2,?rows?*?0.1],?[cols?*?0.9,?rows?*?0.2],?[cols?*?0.1,?rows?*?0.9]])
M?=?cv2.getAffineTransform(pts1,?pts2)
dst?=?cv2.warpAffine(img,?M,?(cols,?rows))
cv2.imshow('affine?lenna',?dst)
key?=?cv2.waitKey(0)
if?key?==?27:
????cv2.destroyAllWindows()
8.透視變化

def?random_warp(img,?row,?col):
????height,?width,?channels?=?img.shape
????#?warp:
????random_margin?=?60
????x1?=?random.randint(-random_margin,?random_margin)
????y1?=?random.randint(-random_margin,?random_margin)
????x2?=?random.randint(width?-?random_margin?-?1,?width?-?1)
????y2?=?random.randint(-random_margin,?random_margin)
????x3?=?random.randint(width?-?random_margin?-?1,?width?-?1)
????y3?=?random.randint(height?-?random_margin?-?1,?height?-?1)
????x4?=?random.randint(-random_margin,?random_margin)
????y4?=?random.randint(height?-?random_margin?-?1,?height?-?1)
????dx1?=?random.randint(-random_margin,?random_margin)
????dy1?=?random.randint(-random_margin,?random_margin)
????dx2?=?random.randint(width?-?random_margin?-?1,?width?-?1)
????dy2?=?random.randint(-random_margin,?random_margin)
????dx3?=?random.randint(width?-?random_margin?-?1,?width?-?1)
????dy3?=?random.randint(height?-?random_margin?-?1,?height?-?1)
????dx4?=?random.randint(-random_margin,?random_margin)
????dy4?=?random.randint(height?-?random_margin?-?1,?height?-?1)
????pts1?=?np.float32([[x1,?y1],?[x2,?y2],?[x3,?y3],?[x4,?y4]])
????pts2?=?np.float32([[dx1,?dy1],?[dx2,?dy2],?[dx3,?dy3],?[dx4,?dy4]])
????M_warp?=?cv2.getPerspectiveTransform(pts1,?pts2)
????img_warp?=?cv2.warpPerspective(img,?M_warp,?(width,?height))
????return?M_warp,?img_warp
M_warp,?img_warp?=?random_warp(img,?img.shape[0],?img.shape[1])
cv2.imshow('lenna_warp',?img_warp)
key?=?cv2.waitKey(0)
if?key?==?27:
????cv2.destroyAllWindows()
lenna近照

再厲害的圖片處理,也抵擋不過時間的威力,將近七旬的“小姐姐”以另一種方式為圖片處理領(lǐng)域作出了自己的貢獻(xiàn)
評論
圖片
表情
