python实现mask矩阵(根据列表所给元素)

行和列的位置都在以下三个列表中的一列中,则对应位置为1,其余位置全为0

​ ——[7-56,239-327,438-454,522-556,574-586]

​ ——[57-85,96-112,221-238]

​ ——[113-220,328-437,455-521,557-573]

代码实现
def generateMaskBasedOnDom(dom_path, length):
    """
    :param dom_path: this is a file path, which contains the following information:
    [7-56,239-327,438-454,522-556,574-586][57-85,96-112,221-238][113-220,328-437,455-521,557-573]
    each [...] means one domain
    :param length: this is the length of this protein
    :return: the mask matrix with size length x length, 1 means inner domain residue pair, otherwise 0
    """
    # 读取文件
    with open(dom_path, "r", encoding="utf-8") as file:
        contents = file.readlines()

    # 获得mask位置数据
    list0 = []
    list1 = []
    list2 = []
    for list_idx, content in enumerate(contents):
        num_range_list = content.strip()[1:-1].split(",")
        for num_range in num_range_list:
            start_num = int(num_range.split("-")[0])
            end_num = int(num_range.split("-")[1])
            for num in range(start_num, end_num+1):
                if list_idx == 0:
                    list0.append(num)
                elif list_idx == 1:
                    list1.append(num)
                else:
                    list2.append(num)

    mask = np.zeros((length, length))
    # 遍历矩阵每个元素
    for row in range(mask.shape[0]):
        for col in range(mask.shape[1]):
            if (row in list0 and col in list0) or (row in list1 and col in list1) or (row in list2 and col in list2):
                mask[row][col] = 1

    return mask

if __name__ == "__main__":

    # if no dom file ,please get dom file first
    with open("dom.txt", "w", encoding="utf-8") as f:
        f.write("[7-56,239-327,438-454,522-556,574-586]" + "\n" + "[57-85,96-112,221-238]" + "\n" + "[113-220,328-437,455-521,557-573]")

    file_path = "./dom.txt"
    protein_length = 1000   # mask_matrix size
    mask_matrix = generateMaskBasedOnDom(file_path, protein_length)
    print("*************Generate Mask Matrix Successful!*************")

    # 随机测试几组
    print(mask_matrix[7][56])  # 1
    print(mask_matrix[7][239])  # 1
    print(mask_matrix[8][57])   # 0
    print(mask_matrix[57][95])  # 0
    print(mask_matrix[113][573])  # 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hessian矩阵滤波是一种常用的图像增强方法,可以用于检测图像中的边缘和角点等特征。实现Hessian矩阵滑动窗口图像增强的步骤如下: 1. 安装必要的Python库,如numpy、scipy、matplotlib、opencv等。 2. 读取待处理的图像,并将其转换为灰度图像。 3. 按照指定的窗口大小,对图像进行分块处理。 4. 对每个窗口内的像素点,计算其Hessian矩阵,并求解其特征值。 5. 根据特征值的大小,判断当前像素点是否为边缘或角点,如果是则进行标记。 6. 将标记后的图像进行输出或保存。 下面是一个简单的Python实现示例: ```python import cv2 import numpy as np from scipy.ndimage.filters import gaussian_filter from scipy.ndimage.filters import convolve # 读取图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 定义Hessian矩阵 def hessian_matrix(gray, sigma=1): # 计算高斯滤波核 ksize = int(4 * sigma + 1) gauss = cv2.getGaussianKernel(ksize, sigma) gauss = np.outer(gauss, gauss) # 计算导数 dx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) dy = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]) dxx = convolve(gray, dx, mode='constant') dyy = convolve(gray, dy, mode='constant') dxy = convolve(gaussian_filter(gray, sigma), dx, mode='constant') dxy = convolve(dxy, dy.T, mode='constant') # 计算Hessian矩阵 H = np.zeros((gray.shape[0], gray.shape[1], 2, 2)) H[:, :, 0, 0] = convolve(dxx, gauss, mode='constant') H[:, :, 0, 1] = convolve(dxy, gauss, mode='constant') H[:, :, 1, 0] = H[:, :, 0, 1] H[:, :, 1, 1] = convolve(dyy, gauss, mode='constant') return H # 计算特征值 def eigenvalue(H): eig1 = 0.5 * (H[:, :, 0, 0] + H[:, :, 1, 1] + np.sqrt((H[:, :, 0, 0] - H[:, :, 1, 1]) ** 2 + 4 * H[:, :, 0, 1] ** 2)) eig2 = 0.5 * (H[:, :, 0, 0] + H[:, :, 1, 1] - np.sqrt((H[:, :, 0, 0] - H[:, :, 1, 1]) ** 2 + 4 * H[:, :, 0, 1] ** 2)) return eig1, eig2 # 定义窗口大小和阈值 win_size = 5 threshold = 1000 # 滑动窗口处理图像 for i in range(img.shape[0] // win_size): for j in range(img.shape[1] // win_size): x = i * win_size y = j * win_size patch = gray[x:x+win_size, y:y+win_size] H = hessian_matrix(patch) eig1, eig2 = eigenvalue(H) mask = (eig1 > threshold) & (eig2 > threshold) img[x:x+win_size, y:y+win_size][mask] = [0, 255, 0] # 标记为绿色 # 显示图像 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先定义了一个`hessian_matrix`函数用于计算Hessian矩阵,然后定义了一个`eigenvalue`函数用于计算特征值。接着,我们指定了窗口大小和阈值,并利用嵌套循环对图像进行滑动窗口处理。对于每个窗口内的像素点,我们都计算其Hessian矩阵,并根据特征值的大小判断当前像素点是否为边缘或角点,如果是则进行标记。最后,我们将标记后的图像进行输出或保存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值