微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获得正确的拉普拉斯锐化 .raw 图像?

如何解决如何获得正确的拉普拉斯锐化 .raw 图像?

我正在尝试使用此算法对月球图像进行拉普拉斯锐化

image of formula

我正在转换这张图片

original image

但我不知道为什么我得到这样的图像:

output image

这是我的代码

import numpy as np

def readRawFile(name,row_size,column_size):
    imgFile = open(name,'rb')
    img = np.fromfile(imgFile,dtype = np.uint8,count = row_size * column_size)
    img = np.reshape(img,(-1,row_size))
    imgFile.close()
    return img

img = readRawFile("ass-3/moon464x528.raw",464,528)

width = img.shape[0]
height = img.shape[1]

img_pad = np.pad(img,((1,1),(1,1)),'edge')

w = np.array([1,1.2,1])

t1 = np.array([[0,-1,0],[-1,4,-1],[0,0]])

edge_img = np.zeros((width,height))
edge_pad = np.pad(edge_img,'constant')

for i in range(1,width-1):
    for j in range(1,height-1):
                
        edge_pad[i,j]=abs(np.sum((img_pad[i:i + 3,j:j + 3] * t1)*w))
        
        if edge_pad[i,j] < 0:
            edge_pad[i,j] = 0

out_img = img-edge_pad[1:edge_pad.shape[0]-1,1:edge_pad.shape[1]-1]
out_img.astype('int8').tofile("ass-3/moon-1.raw")

有人可以帮我吗?

解决方法

我发现了几个问题:

  • 边缘图像允许有正负值。
    删除 abs,然后删除 if edge_pad[i,j] < 0...
  • “窗口”img_pad[i:i + 3,j:j + 3] 不以[i,j] 为中心,替换为:
    img_pad[i-1:i+2,j-1:j+2]
    (寻找 2D 离散卷积实现)。
  • 我认为公式中的 w 应该是负标量。
    w = np.array([1,1.2,1]) 替换为 w = -1.2
  • t1edge_pad的类型为np.float64img的类型为np.uint8
    img - edge_pad[1:edge_pad.shape[0] - 1,1:edge_pad.shape[1] - 1] 的类型是 np.float64
    我们需要将值裁剪到范围 [0,255] 并转换为 np.uint8:
    out_img = np.clip(out_img,255).astype(np.uint8)

我看不到与 .raw 格式有关的任何问题。
我把输入输出换成了PNG图片格式,使用OpenCV来读写图片。
OpenCV 的用法仅作为示例 - 您不需要使用 OpenCV。


这是一个“完整”的代码示例:

import numpy as np
import cv2

#def readRawFile(name,row_size,column_size):
#    imgFile = open(name,'rb')
#    img = np.fromfile(imgFile,dtype=np.uint8,count=row_size * column_size)
#    img = np.reshape(img,(-1,row_size))
#    imgFile.close()
#    return img

#img = readRawFile("ass-3/moon464x528.raw",464,528)
img = cv2.imread('moon.png',cv2.IMREAD_GRAYSCALE)  # Read input image as grayscale.

width = img.shape[0]  # The first index is the height (the names are swapped)
height = img.shape[1]

img_pad = np.pad(img,((1,1),(1,1)),'edge')

#w = np.array([1,1])
w = -1.2  # I think w in the formula is supposed to be a negative a scalar

t1 = np.array([[0,-1,0],[-1,4,-1],[0,0]])

edge_img = np.zeros((width,height))
edge_pad = np.pad(edge_img,'constant')

for i in range(1,width - 1):
    for j in range(1,height - 1):

        #edge_pad[i,j] = abs(np.sum((img_pad[i:i + 3,j:j + 3] * t1) * w))
        # Edge is allowed to be negative.
        edge_pad[i,j] = np.sum(img_pad[i-1:i+2,j-1:j+2] * t1) * w

        #if edge_pad[i,j] < 0:
        #    edge_pad[i,j] = 0

# img tyep is uint8 and edge_pad is float64,the result is float64
out_img = img - edge_pad[1:edge_pad.shape[0] - 1,1:edge_pad.shape[1] - 1]
out_img = np.clip(out_img,255).astype(np.uint8)  # Clip range to [0,255] and cast to uint8

#out_img.astype('int8').tofile("ass-3/moon-1.raw")

cv2.imwrite('out_img.png',out_img)  # Save out_img as PNG image file

# Show the input and the output images for testing
cv2.imshow('img',img)
cv2.imshow('edge_pad',(edge_pad-edge_pad.min())/(edge_pad.max() - edge_pad.min()))
cv2.imshow('out_img',out_img)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

img
enter image description here

out_img
enter image description here

edge_pad(线性对比度拉伸后):
enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?