二值化
非0元素取1法
非零元素取一法是最基础的二值化算法。顾名思义,非零取一就是对于灰度图像f,若某像素灰度值为零,则其灰度值不变,仍为零;对于灰度值不为零的像素,将其像素值全部变为255。
img = np.zeros((w, h), dtype=np.uint8)
for j in range(h):
for i in range(w):
if grey[j, i] != 0:
img[j, i] = 255
固定阀值法
固定阀值法就是为灰度图像f设定一个阀值T,把灰度值小于给定阈值T的像素置为0,大于阈值T的像素置为255,从而对灰度图像实现二值化变换。
img = np.zeros((w, h), dtype=np.uint8)
for j in range(h):
for i in range(w):
if grey[j, i] > 125:
img[j, i] = 255
双固定阀值法
双固定阀值法预先设置了两个阀值T1和T2,T1<T2,当对图像进行处理时,如果某个像素的灰度值小于T1则置0(或者255);如果大于T1并且小于T2时,则置255(或者置0);如果大于T2时,则置0(或者255)。
img = np.zeros((w, h), dtype=np.uint8)
for j in range(h):
for i in range(w):
if grey[j, i] > 125 and grey[j, i] < 200:
img[j, i] = 255
灰度变换
反色变换处理
img = np.zeros((w, h), dtype=np.uint8)
for j in range(h):
for i in range(w):
img[j, i] = 255 - grey[j, i]
窗口变换处理
当图像中大部分像素的灰度级在[L,U]范围内,少部分像素分布在小于L和大于U的区间内时,可用两端“截取式”的变换使小于灰度级L和大于等于灰度级U的像素强行压缩为0和255。这种变换叫灰度的窗口变换。
img = np.zeros((w, h), dtype=np.uint8)
for j in range(h):
for i in range(w):
if grey[j, i] < 50:
img[j, i] = 0
elif grey[j, i] > 180:
img[j, i] = 255
else:
img[j, i] = grey[j, i]
分段线性变换
将图像灰度区间分成两段乃至多段,分别做线性变换称之为分段线性变换。它的灰度变换函数 如图所示,函数表达式如下:
img = np.zeros((w, h), dtype=np.uint8)
x1 = 130
y1 = 50
x2 = 150
y2 = 200
bMap = [0]*256
# 灰度映射
for i in range(256):
if i <= x1:
if x1 > 0:
bMap[i] = int(y1 * i / x1)
else:
bMap[i] = 0
elif i > x1 and i <= x2:
if x2 != x1:
bMap[i] = y1 + int((y2 - y1) * (i - x1) / (x2 - x1))
else:
bMap[i] = y1
elif i < 256:
if (x2 != 255):
bMap[i] = y2 + int((255 - y2) * (i - x2) / (255 - x2))
else:
bMap[i] = 255
for j in range(h):
for i in range(w):
img[j, i] = bMap[grey[j, i]]
对数变换
dTemp=math.log(i+1)/0.025+10
if dTemp>255:
dTemp=255
elif dTemp<0:
dTemp=0
幂次变换
dTemp = 1.0*math.pow(i/255.0,1.7) +20
if dTemp > 255:
dTemp = 255
elif dTemp < 0:
dTemp = 0
直方图
直方图
表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率。它是图像最基本的统计特征。
横坐标:灰度级;
纵坐标:该灰度级出现的个数。
def hist(self, img):
list = np.zeros(256, dtype=np.float32)
if len(img.shape) == 3:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
H, W = img.shape
for y in range(H):
for x in range(W):
temp = img[y, x]
list[temp] = list[temp] + 1
return list
直方图均衡化
直方图均衡方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清晰图像的目的。通过点运算使输入图像转换为在每一灰度级上都有相同的像素点的数目,即输出图像的直方图是平的。这对于在进行图像比较和分割之前将图像转化为一致的格式是十分有益的。
理论参考 https://blog.csdn.net/imxlw00/article/details/116020150
def hist_equal(self,img, z_max=255):
H, W = img.shape
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out