绘制图像直方图
import cv2
import numpy as np
def ImageHist ( image, type ) :
color = ( 255 , 255 , 255 )
windowName = "Gray"
if type == 31 :
color = ( 255 , 0 , 0 )
windowName = "B Hist"
elif type == 32 :
color = ( 0 , 255 , 0 )
windowName = "G Hist"
elif type == 33 :
color = ( 0 , 0 , 255 )
windowName = "R Hist"
hist = cv2. calcHist( [ image] , [ 0 ] , None , [ 256 ] , [ 0 , 255 ] )
minV, maxV, minL, maxL = cv2. minMaxLoc( hist)
histImg = np. zeros( [ 256 , 256 , 3 ] , np. uint8)
for h in range ( 256 ) :
intenNormal = int ( hist[ h] / maxV* 255 )
cv2. line( histImg, ( h, 255 ) , ( h, 255 - intenNormal) , color)
cv2. imshow( windowName, histImg)
return histImg
img = cv2. imread( "E:\\code\\conputer_visual\\data\\0.jpg" , 1 )
channels = cv2. split( img)
for i in range ( 3 ) :
ImageHist( channels[ i] , 31 + i)
cv2. waitKey( )
matplot绘制灰度图直方图
import cv2
import numpy as np
import matplotlib. pyplot as plt
img = cv2. imread( "E:\\code\\conputer_visual\\data\\01.jpg" , 1 )
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
gray = cv2. cvtColor( img, cv2. COLOR_BGR2GRAY)
count = np. zeros( 256 , np. float )
for i in range ( height) :
for j in range ( width) :
pixel = gray[ i, j]
index = int ( pixel)
count[ index] = count[ index] + 1
for i in range ( 256 ) :
count[ i] = count[ i] / ( height* width)
x = np. linspace( 0 , 255 , 256 )
y = count
plt. bar( x, y, 0.9 , alpha= 1 , color= "b" )
plt. show( )
cv2. waitKey( )
matplot绘制彩色图直方图
import cv2
import numpy as np
import matplotlib. pyplot as plt
img = cv2. imread( "E:\\code\\conputer_visual\\data\\01.jpg" , 1 )
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
count_b = np. zeros( 256 , np. float )
count_g = np. zeros( 256 , np. float )
count_r = np. zeros( 256 , np. float )
for i in range ( height) :
for j in range ( width) :
( b, g, r) = img[ i, j]
index_b = int ( b)
index_g = int ( g)
index_r = int ( r)
count_b[ index_b] += 1
count_g[ index_g] += 1
count_r[ index_r] += 1
for i in range ( 256 ) :
count_b[ i] = count_b[ i] / ( height* width)
count_g[ i] = count_g[ i] / ( height* width)
count_r[ i] = count_r[ i] / ( height* width)
x = np. linspace( 0 , 255 , 256 )
y1 = count_b
y2 = count_g
y3 = count_r
plt. figure( )
plt. bar( x, y1, 0.9 , alpha= 1 , color= "b" )
plt. figure( )
plt. bar( x, y2, 0.9 , alpha= 1 , color= "g" )
plt. figure( )
plt. bar( x, y3, 0.9 , alpha= 1 , color= "r" )
plt. show( )
灰度图像直方图均衡化
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\0.jpg" , 1 )
gray = cv2. cvtColor( img, cv2. COLOR_BGR2GRAY)
cv2. imshow( "src" , gray)
dst = cv2. equalizeHist( gray)
cv2. imshow( "dst" , dst)
cv2. waitKey( )
import cv2
import numpy as np
import matplotlib. pyplot as plt
img = cv2. imread( "E:\\code\\conputer_visual\\data\\01.jpg" , 1 )
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
gray = cv2. cvtColor( img, cv2. COLOR_BGR2GRAY)
cv2. imshow( "src" , gray)
count = np. zeros( 256 , np. float )
for i in range ( height) :
for j in range ( width) :
pixel = gray[ i, j]
index = int ( pixel)
count[ index] = count[ index] + 1
for i in range ( 256 ) :
count[ i] = count[ i] / ( height* width)
sum1 = float ( 0 )
for i in range ( 256 ) :
sum1 = sum1 + count[ i]
count[ i] = sum1
map1 = np. zeros( 256 , np. uint16)
for i in range ( 256 ) :
map1[ i] = np. uint16( count[ i] * 255 )
for i in range ( height) :
for j in range ( width) :
pixel = gray[ i, j]
gray[ i, j] = map1[ pixel]
cv2. imshow( "dst" , gray)
cv2. waitKey( )
principle 统计出0-255个像素值出现的概率,计算出累计概率。然后renew原图中的像素值为 原像素值*对应累计概率值
彩色图像直方图均衡化
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\0.jpg" , 1 )
cv2. imshow( "src" , img)
( b, g, r) = cv2. split( img)
bH = cv2. equalizeHist( b)
gH = cv2. equalizeHist( g)
rH = cv2. equalizeHist( r)
result = cv2. merge( ( bH, gH, rH) )
cv2. imshow( "dst" , result)
cv2. waitKey( )
import cv2
import numpy as np
import matplotlib. pyplot as plt
img = cv2. imread( "E:\\code\\conputer_visual\\data\\01.jpg" , 1 )
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
count_b = np. zeros( 256 , np. float )
count_g = np. zeros( 256 , np. float )
count_r = np. zeros( 256 , np. float )
for i in range ( height) :
for j in range ( width) :
( b, g, r) = img[ i, j]
index_b = int ( b)
index_g = int ( g)
index_r = int ( r)
count_b[ index_b] += 1
count_g[ index_g] += 1
count_r[ index_r] += 1
for i in range ( 256 ) :
count_b[ i] = count_b[ i] / ( height* width)
count_g[ i] = count_g[ i] / ( height* width)
count_r[ i] = count_r[ i] / ( height* width)
sum_b = float ( 0 )
sum_g = float ( 0 )
sum_r = float ( 0 )
for i in range ( 256 ) :
sum_b = sum_b + count_b[ i]
sum_g = sum_g + count_b[ i]
sum_r = sum_r + count_b[ i]
count_b[ i] = sum_b
count_g[ i] = sum_g
count_r[ i] = sum_r
mapb = np. zeros( 256 , np. uint16)
mapg = np. zeros( 256 , np. uint16)
mapr = np. zeros( 256 , np. uint16)
for i in range ( 256 ) :
mapb[ i] = np. uint16( count_b[ i] * 255 )
mapg[ i] = np. uint16( count_g[ i] * 255 )
mapr[ i] = np. uint16( count_r[ i] * 255 )
dst = np. zeros( ( height, width, 3 ) , np. uint8)
for i in range ( height) :
for j in range ( width) :
( b, g, r) = img[ i, j]
b = mapb[ b]
g = mapg[ g]
r = mapr[ r]
dst[ i, j] = ( b, g, r)
cv2. imshow( "src" , img)
cv2. imshow( "dst" , dst)
cv2. waitKey( )
YUV直方图均衡化
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\0.jpg" , 1 )
imgYUV = cv2. cvtColor( img, cv2. COLOR_BGR2YCrCb)
cv2. imshow( "src" , imgYUV)
channelYUV = cv2. split( imgYUV)
channelYUV[ 0 ] = cv2. equalizeHist( channelYUV[ 0 ] )
channels = cv2. merge( channelYUV)
result = cv2. cvtColor( channels, cv2. COLOR_YCrCb2BGR)
cv2. imshow( "dst" , result)
cv2. waitKey( )
图像修复
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\0.jpg" , 1 )
for i in range ( 110 , 150 ) :
img[ i, 140 ] = ( 255 , 255 , 255 )
img[ i, 140 + 1 ] = ( 255 , 255 , 255 )
img[ i, 140 - 1 ] = ( 255 , 255 , 255 )
for i in range ( 120 , 160 ) :
img[ 130 , i] = ( 255 , 255 , 255 )
img[ 130 + 1 , i] = ( 255 , 255 , 255 )
img[ 130 - 1 , i] = ( 255 , 255 , 255 )
cv2. imwrite( "E:\\code\\conputer_visual\\data\\damaged.jpg" , img)
cv2. imshow( "image" , img)
cv2. waitKey( )
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\damaged.jpg" , 1 )
cv2. imshow( "src" , img)
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
paint = np. zeros( ( height, width, 1 ) , np. uint8)
for i in range ( 110 , 150 ) :
paint[ i, 140 ] = 255
paint[ i, 140 + 1 ] = 255
paint[ i, 140 - 1 ] = 255
for i in range ( 120 , 160 ) :
paint[ 130 , i] = 255
paint[ 130 + 1 , i] = 255
paint[ 130 - 1 , i] = 255
cv2. imshow( "paint" , paint)
imgDst = cv2. inpaint( img, paint, 3 , cv2. INPAINT_TELEA)
cv2. imshow( "dst" , imgDst)
cv2. waitKey( )
图像亮度增强
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\01.jpg" , 1 )
imgInfo = img. shape
height, width = imgInfo[ 0 ] , imgInfo[ 1 ]
cv2. imshow( "src" , img)
dst = np. zeros( ( height, width, 3 ) , np. uint8)
for i in range ( height) :
for j in range ( width) :
( b, g, r) = img[ i, j]
bb = int ( b* 1.2 ) + 10
gg = int ( g* 1.3 ) + 15
rr = int ( r) + 40
if bb > 255 :
bb = 255
if gg > 255 :
gg = 255
if rr > 255 :
rr = 255
dst[ i, j] = ( bb, gg, rr)
cv2. imshow( "dst" , dst)
cv2. waitKey( )
磨皮美白
import cv2
img = cv2. imread( "E:\\code\\conputer_visual\\data\\hand skin.jpg" , 1 )
dst = cv2. bilateralFilter( img, 15 , 35 , 35 )
cv2. imshow( "src" , img)
cv2. imshow( "dst" , dst)
cv2. waitKey( )
高斯滤波降噪
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\001dots.png" , 1 )
cv2. imshow( "src" , img)
dst = cv2. GaussianBlur( img, ( 5 , 5 ) , 1.5 )
cv2. imshow( "dst" , dst)
cv2. waitKey( )
均值滤波降噪
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\001dots.png" , 1 )
cv2. imshow( "src" , img)
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
dts = np. zeros( ( height, width, 3 ) , np. uint8)
for i in range ( 3 , height- 3 ) :
for j in range ( 3 , width- 3 ) :
sum_b = int ( 0 )
sum_g = int ( 0 )
sum_r = int ( 0 )
for m in range ( - 3 , 3 ) :
for n in range ( - 3 , 3 ) :
( b, g, r) = img[ i+ m, j+ n]
sum_b += int ( b)
sum_g += int ( g)
sum_r += int ( r)
b = np. uint8( sum_b/ 36 )
g = np. uint8( sum_g/ 36 )
r = np. uint8( sum_r/ 36 )
dst[ i, j] = ( b, g, r)
cv2. imshow( "dst" , dst)
cv2. waitKey( )
原理 将每个像素点的像素值更新为该像素点所在的6*6像素阵的像素均值
中值滤波降噪
import cv2
import numpy as np
img = cv2. imread( "E:\\code\\conputer_visual\\data\\001dots.png" , 1 )
img = cv2. cvtColor( img, cv2. COLOR_BGR2GRAY)
cv2. imshow( "src" , img)
imgInfo = img. shape
height = imgInfo[ 0 ]
width = imgInfo[ 1 ]
dst = np. zeros( ( height, width, 1 ) , np. uint8)
collect = np. zeros( 9 , np. uint8)
for i in range ( 1 , height- 1 ) :
for j in range ( 1 , width- 1 ) :
k= 0
for m in range ( - 1 , 2 ) :
for n in range ( - 1 , 2 ) :
gray = img[ i+ m, j+ n]
collect[ k] = gray
k += 1
collect = np. sort( collect)
dst[ i, j] = collect[ 4 ]
cv2. imshow( "dst" , dst)
cv2. waitKey( )
原理 与均值滤波类似,将每个像素点的像素值更新为所在3*3像素阵的像素中值(排序后)