求取差值图像时,解决两个图像相减,差值图像结果限定在[0,255]范围内问题

这是因为当我们使用imread函数直接去加载图像时,读取的图像格式是 CV_8UC3 即为uint8 是unsigned 的,因此在图像相减过程中会自动将像素值限定在[0,255]范围内。假设img1中像素值为(12,3,255),img2像素值为(13,4,23),则img1-img2的像素值为(255,255,232),但是我们实际上是需要(-1,-1, 232)。为了解决这个问题,我们可以在读取图片时,将图片的格式改为int32的形式,这样就可以让负数不直接变为0。下面对应两种相减方式,以及其对应的效果。为了更好的体现差值图像的效果,我们对差值图像还做了归一化的操作。

求取差值图像时,解决两个图像相减,差值图像结果限定在[0,255]范围内问题_第1张图片求取差值图像时,解决两个图像相减,差值图像结果限定在[0,255]范围内问题_第2张图片

                  img1                                                       img2

 

一、直接相减,及其差值图像

def grey_scale(img_gray ):
//归一化函数
    rows, cols = img_gray.shape
    flat_gray = img_gray.reshape((cols * rows,)).tolist()
    A = min(flat_gray)
    B = max(flat_gray)
    print('A = %d,B = %d' % (A, B))
    output = np.uint8(255 / (B - A) * (img_gray - A) + 0.5)
    return output

img_1=cv2.imread("C:\\Users\\ASUS\\Desktop\\image_lib\\house.png",0)
img_2=cv2.imread("C:\\Users\\ASUS\\Desktop\\image_lib\house_256_20.png",0)
img=img_1-img_2
result=grey_scale(img) //图片归一化
cv2.imwrite("C:\\Users\\ASUS\\Desktop\\9c.jpg",result)

 

求取差值图像时,解决两个图像相减,差值图像结果限定在[0,255]范围内问题_第3张图片

二、读取时改变图像类型,再相减操作

def grey_scale(img_gray ):
    //归一化函数
    rows, cols = img_gray.shape
    flat_gray = img_gray.reshape((cols * rows,)).tolist()
    A = min(flat_gray)
    B = max(flat_gray)
    print('A = %d,B = %d' % (A, B))
    output = np.uint8(255 / (B - A) * (img_gray - A) + 0.5)
    return output


img_1=cv2.imread("C:\\Users\\ASUS\\Desktop\\image_lib\\house.png",0).astype(np.int32)
img_2=cv2.imread("C:\\Users\\ASUS\\Desktop\\image_lib\house_256_20.png",0).astype(np.int32)
img=img_1-img_2
result=grey_scale(img) //归一化操作
cv2.imwrite("C:\\Users\\ASUS\\Desktop\\9c.jpg",result)

 

求取差值图像时,解决两个图像相减,差值图像结果限定在[0,255]范围内问题_第4张图片

差值图像

你可能感兴趣的:(图像处理)