python实现对彩色jpg图片进行自适应中值滤波器并大幅度锐化边缘

时间: 2023-09-06 09:14:34 浏览: 33
好的,针对您的问题,我可以给出以下的Python代码来实现对彩色JPG图片的自适应中值滤波器和边缘锐化处理: ```python import cv2 import numpy as np # 读入彩色JPG图片 img = cv2.imread('test.jpg') # 自适应中值滤波器 def adaptive_median_filter(img, max_size): for i in range(img.shape[0]): for j in range(img.shape[1]): filter_size = 3 while filter_size <= max_size: offset = filter_size // 2 values = [] for x in range(-offset, offset+1): for y in range(-offset, offset+1): if i+x < 0 or i+x >= img.shape[0] or j+y < 0 or j+y >= img.shape[1]: continue values.append(img[i+x][j+y]) values.sort() median = values[len(values) // 2] min_value = values[0] max_value = values[-1] if min_value < median < max_value: break else: filter_size += 2 img[i][j] = median return img # 锐化边缘 def edge_sharpening(img): # 灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 拉普拉斯算子 laplacian = cv2.Laplacian(gray_img, cv2.CV_64F) # 边缘加强 sharpened = img - 0.5 * laplacian # 调整像素值范围 sharpened = np.uint8(np.clip(sharpened, 0, 255)) return sharpened # 自适应中值滤波器处理 img = adaptive_median_filter(img, 7) # 边缘锐化处理 img = edge_sharpening(img) # 显示处理后的图片 cv2.imshow('Processed Image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码使用了OpenCV库来进行图像处理,其中自适应中值滤波器和边缘锐化都是基于像素级的操作,因此可以适用于彩色JPG图片的处理。请注意,在进行自适应中值滤波器时,我们需要指定最大的滤波器大小,因此这里的代码中使用了7作为最大的滤波器大小。另外,边缘锐化处理中,我们使用了拉普拉斯算子来寻找边缘,然后对边缘进行加强操作。

相关推荐

好的,为了保存处理后的彩色图像,我们可以在上一段代码的基础上进行一些修改。具体来说,我们需要添加一个保存图像的操作。以下是修改后的代码: python import cv2 import numpy as np # 读入彩色JPG图片 img = cv2.imread('test.jpg') # 自适应中值滤波器 def adaptive_median_filter(img, max_size): for i in range(img.shape[0]): for j in range(img.shape[1]): filter_size = 3 while filter_size <= max_size: offset = filter_size // 2 values = [] for x in range(-offset, offset+1): for y in range(-offset, offset+1): if i+x < 0 or i+x >= img.shape[0] or j+y < 0 or j+y >= img.shape[1]: continue values.append(img[i+x][j+y]) values.sort() median = values[len(values) // 2] min_value = values[0] max_value = values[-1] if min_value < median < max_value: break else: filter_size += 2 img[i][j] = median return img # 锐化边缘 def edge_sharpening(img): # 灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 拉普拉斯算子 laplacian = cv2.Laplacian(gray_img, cv2.CV_64F) # 边缘加强 sharpened = img - 0.5 * laplacian # 调整像素值范围 sharpened = np.uint8(np.clip(sharpened, 0, 255)) return sharpened # 自适应中值滤波器处理 img = adaptive_median_filter(img, 7) # 边缘锐化处理 img = edge_sharpening(img) # 保存处理后的图像 cv2.imwrite('processed.jpg', img) # 显示处理后的图像 cv2.imshow('Processed Image', img) cv2.waitKey(0) cv2.destroyAllWindows() 在上述代码中,我们通过cv2.imwrite()函数将处理后的图像保存在了名为"processed.jpg"的文件中。您可以在保存的文件夹中查看这张图像。
自适应中值滤波器是一种能够有效处理图像中不同大小的噪声的滤波器。下面是使用Python实现对彩色图像使用自适应中值滤波器的示例代码: python import cv2 import numpy as np def adaptive_median_filter(img, max_size): """ 自适应中值滤波器 :param img: 原始图像 :param max_size: 最大滤波器尺寸 :return: 滤波结果 """ h, w, c = img.shape result = np.zeros((h, w, c), dtype=np.uint8) for i in range(h): for j in range(w): for k in range(c): size = 3 while size <= max_size: x1 = max(i - size // 2, 0) y1 = max(j - size // 2, 0) x2 = min(i + size // 2, h - 1) y2 = min(j + size // 2, w - 1) window = img[x1:x2 + 1, y1:y2 + 1, k] median = np.median(window) zmin = np.min(window) zmax = np.max(window) a1 = median - zmin a2 = median - zmax if a1 > 0 and a2 < 0: b1 = img[i, j, k] - zmin b2 = img[i, j, k] - zmax if b1 > 0 and b2 < 0: result[i, j, k] = img[i, j, k] else: result[i, j, k] = median break else: size += 2 if size > max_size: result[i, j, k] = median return result # 加载彩色图像 img = cv2.imread('color_image.jpg') # 对图像进行自适应中值滤波 result = adaptive_median_filter(img, 7) # 显示结果 cv2.imshow('Original', img) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() 其中,adaptive_median_filter函数实现了自适应中值滤波器。它使用一个滑动窗口来计算局部区域的中值,并根据中值与局部最小值和最大值的关系来判断是否需要对当前像素进行滤波。max_size参数指定了滤波器的最大尺寸。在函数中,我们使用了numpy库中的一些函数,如np.median、np.min和np.max等。 在主程序中,我们加载了一张彩色图像,并对其进行自适应中值滤波。最后,我们显示了原始图像和滤波结果。你可以替换color_image.jpg为你自己的彩色图像,并调整max_size参数来比较不同滤波器尺寸下的效果。
Python中的彩色图像自适应中值滤波器可以通过以下步骤实现,得到彩色图像: 1. 载入彩色图像。 python import cv2 img = cv2.imread('color_img.jpg') 2. 定义一个自适应中值滤波器函数。 python def adaptive_median_filter(img, window_size): img_output = np.copy(img) for channel in range(3): channel_img = img[:, :, channel] median = cv2.medianBlur(channel_img, window_size) img_local = channel_img - median img_local_max = cv2.dilate(img_local, np.ones((window_size, window_size))) img_local_min = cv2.erode(img_local, np.ones((window_size, window_size))) img_local_max_min_diff = img_local_max - img_local_min img_local_max_min_diff_mask = img_local_max_min_diff > 0 img_output[:, :, channel][img_local_max_min_diff_mask] = median[img_local_max_min_diff_mask] return img_output 3. 调用自适应中值滤波器函数并输出结果。 python filtered_img = adaptive_median_filter(img, 3) cv2.imshow('Filtered Image', filtered_img) cv2.waitKey(0) cv2.destroyAllWindows() 上述代码中,自适应中值滤波器函数的参数包括原始图像和窗口大小。函数中使用cv2.medianBlur函数计算每个颜色通道的中值,然后计算每个颜色通道的局部图像与中值之间的差异。接下来,使用cv2.dilate和cv2.erode函数计算局部图像的最大值和最小值,计算它们之间的差异,并创建一个布尔掩码来标识差异大于零的像素。最后,将每个颜色通道中的像素复制到输出图像中,如果差异大于零,则使用中值图像中的像素替换原始图像中的像素。 注意,这里的输出图像是彩色图像,因为在函数中处理了每个颜色通道。
Python中的彩色图像自适应中值滤波器可以通过以下步骤实现: 1. 载入彩色图像并将其转换为灰度图像。 python import cv2 img = cv2.imread('color_img.jpg') gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 2. 定义一个自适应中值滤波器函数。 python def adaptive_median_filter(img, window_size): median = cv2.medianBlur(img, window_size) img_local = img - median img_local_max = cv2.dilate(img_local, np.ones((window_size, window_size))) img_local_min = cv2.erode(img_local, np.ones((window_size, window_size))) img_local_max_min_diff = img_local_max - img_local_min img_local_max_min_diff_mask = img_local_max_min_diff > 0 img_output = np.copy(img) img_output[img_local_max_min_diff_mask] = median[img_local_max_min_diff_mask] return img_output 3. 调用自适应中值滤波器函数并输出结果。 python filtered_img = adaptive_median_filter(gray_img, 3) cv2.imshow('Filtered Image', filtered_img) cv2.waitKey(0) cv2.destroyAllWindows() 上述代码中,自适应中值滤波器函数的参数包括原始图像和窗口大小。函数中使用cv2.medianBlur函数计算图像的中值,然后计算局部图像与中值之间的差异。接下来,使用cv2.dilate和cv2.erode函数计算局部图像的最大值和最小值,计算它们之间的差异,并创建一个布尔掩码来标识差异大于零的像素。最后,将中值图像中的像素复制到输出图像中,如果差异大于零,则使用中值图像中的像素替换原始图像中的像素。
在Matlab中实现自适应中值滤波器可以按照以下步骤进行: 1. 读取需要进行滤波的图像,并将其转换为灰度图像。 2. 设定滤波器的窗口大小,一般情况下选择3x3或5x5的窗口。 3. 对于每个像素点,将其所在的窗口中的像素值排序。 4. 计算窗口中像素值的中值,并将其作为该像素点的新值。 5. 如果中值与当前像素点值之差小于某个阈值,则将窗口大小加1,继续进行中值计算;否则输出当前像素点值。 下面是一个简单的自适应中值滤波器的Matlab代码实现: matlab function output = adaptive_median_filter(input, max_size) % input: 输入的待滤波图像 % max_size: 滤波器窗口的最大尺寸 % output: 滤波后的图像 % 将输入图像转换为灰度图像 input = rgb2gray(input); % 获取输入图像的大小 [row, col] = size(input); % 初始化输出图像 output = zeros(row, col); % 遍历每个像素点 for i = 1:row for j = 1:col % 初始化窗口大小为3 window_size = 3; % 获取当前像素点所在的窗口 window = input(max(i-window_size,1):min(i+window_size,row), max(j-window_size,1):min(j+window_size,col)); % 对窗口中的像素值进行排序 sorted_window = sort(window(:)); % 计算窗口中像素值的中值 median_value = sorted_window(floor(length(sorted_window)/2)+1); % 如果中值与当前像素点值之差小于某个阈值,则将窗口大小加1,继续进行中值计算 while (median_value-input(i,j) < 0) && (window_size < max_size) window_size = window_size+2; window = input(max(i-window_size,1):min(i+window_size,row), max(j-window_size,1):min(j+window_size,col)); sorted_window = sort(window(:)); median_value = sorted_window(floor(length(sorted_window)/2)+1); end % 输出当前像素点值 output(i,j) = median_value; end end % 将输出图像转换为uint8类型 output = uint8(output); end 使用该函数进行自适应中值滤波器的处理: matlab % 读取待处理的图像 input = imread('input.jpg'); % 调用自适应中值滤波器函数 output = adaptive_median_filter(input, 7); % 显示原图和处理后的图 figure(); subplot(1,2,1); imshow(input); title('Input Image'); subplot(1,2,2); imshow(output); title('Output Image'); 其中,第二个参数max_size为滤波器窗口的最大尺寸,可以根据实际情况进行调整。
自适应中值滤波器算法(Adaptive Median Filter)是一种常用的图像处理算法,主要用于去除图像中的椒盐噪声。算法的基本思想是通过对图像中的每个像素点进行分析,用其周围邻域的像素值来估计该像素点的噪声程度,从而决定是否对该像素点进行中值滤波。 具体实现步骤如下: 1. 设定窗口大小和最大窗口大小,将其初始化为一个小值。 2. 对图像中的每个像素点进行遍历,并根据窗口范围内的像素值来进行噪声估计。 3. 如果窗口大小大于最大窗口大小,则将当前像素点的值设置为中值,并将窗口大小重置为初始小值。 4. 否则,根据窗口中的像素点进行排序,并计算中值和中值偏差。 5. 如果当前像素点的值与中值之间的绝对值小于中值偏差的阈值,则认为该像素点是噪声点,将其值设置为中值。 6. 否则,将窗口大小增加1,并重复第2步。 在这个算法中,窗口大小的选取非常重要,如果过小会导致噪声点未被滤除,如果过大会导致图像细节丢失。因此,我们需要根据具体的应用场景来优化窗口大小,以达到最佳的滤波效果。 自适应中值滤波器算法是图像处理中常用的算法之一,因其能够较好地对抗椒盐噪声而得到广泛应用。在实际应用中,我们可以通过调整算法的参数和参数阈值来进行优化,以适应不同的图像噪声类型和强度。
在MATLAB中实现自适应中值滤波器可以使用以下代码: matlab function output = adaptive_median_filter(input, max_window_size) % Initialize output and window size output = input; window_size = 3; % Loop through every pixel in the image for i = 2:size(input,1)-1 for j = 2:size(input,2)-1 % Extract window around current pixel window = input(i-window_size:i+window_size, j-window_size:j+window_size); % Compute median and minimum and maximum values in the window median_value = median(window(:)); min_value = min(window(:)); max_value = max(window(:)); % Check if the current pixel is an impulse noise if (input(i,j) == min_value || input(i,j) == max_value) window_size = window_size + 2; % Increase window size % Check if the new window size exceeds the maximum specified size if (window_size > max_window_size) output(i,j) = median_value; % Use median value else % Extract new window window = input(i-window_size:i+window_size, j-window_size:j+window_size); % Compute new median and minimum and maximum values in the window median_value = median(window(:)); min_value = min(window(:)); max_value = max(window(:)); % Check if the current pixel is still an impulse noise if (input(i,j) == min_value || input(i,j) == max_value) output(i,j) = median_value; % Use median value else output(i,j) = input(i,j); % Use original value end end else output(i,j) = input(i,j); % Use original value end end end end 该函数的输入参数包括输入图像和最大窗口大小,输出为经过自适应中值滤波器处理后的图像。在函数内部,首先初始化输出图像和窗口大小,然后循环遍历输入图像中的每个像素。对于每个像素,提取以其为中心的窗口,计算窗口中的中值、最小值和最大值,并检查当前像素是否为脉冲噪声。如果是,则增加窗口大小并重新提取窗口,直到窗口大小达到最大值为止。如果最终窗口中仍然存在最小值或最大值等脉冲噪声,则将该像素替换为窗口中的中值。如果当前像素不是脉冲噪声,则将其保留为原始值。 使用方法: matlab input = imread('input.jpg'); output = adaptive_median_filter(input, 7); imshow(output); 其中,input为输入图像,7为最大窗口大小。可以根据需要修改最大窗口大小。
好的,我可以为您提供一个matlab代码实现自适应中值滤波器的例子。代码如下: matlab function output_img = adaptive_median_filter(input_img, max_window_size) % 自适应中值滤波器函数 % 输入参数: % input_img:待滤波图像 % max_window_size: 最大窗口尺寸 % 输出参数: % output_img:滤波后的图像 % 获取图像尺寸 [rows, cols] = size(input_img); % 初始化输出图像 output_img = zeros(rows, cols); % 遍历每个像素 for i = 1:rows for j = 1:cols % 获取当前像素的窗口尺寸,初始化为3x3 window_size = 3; while(window_size <= max_window_size) % 获取当前窗口 half_window = floor(window_size/2); window = input_img(max(1,i-half_window):min(rows,i+half_window), max(1,j-half_window):min(cols,j+half_window)); % 计算窗口中像素的排序值 sorted_window = sort(window(:)); min_val = sorted_window(1); max_val = sorted_window(end); median_val = sorted_window(floor(window_size^2/2)+1); % 判断当前像素是否为椒盐噪声 if(input_img(i,j) == min_val || input_img(i,j) == max_val) % 判断是否达到最大窗口,若达到则输出当前像素值,否则扩大窗口 if(window_size == max_window_size) output_img(i,j) = median_val; else window_size = window_size + 2; end else % 判断当前像素是否为高斯噪声 mean_val = mean(window(:)); std_val = std(double(window(:))); if(input_img(i,j) > mean_val-std_val && input_img(i,j) < mean_val+std_val) output_img(i,j) = input_img(i,j); else output_img(i,j) = median_val; end break; end end end end % 将输出图像转化为uint8类型 output_img = uint8(output_img); end 使用该函数进行图像滤波的示例代码: matlab % 读入图像 input_img = imread('input_image.png'); % 设置最大窗口尺寸为7 max_window_size = 7; % 调用自适应中值滤波器函数 output_img = adaptive_median_filter(input_img, max_window_size); % 显示原图和滤波后的图像 figure; subplot(1, 2, 1); imshow(input_img); title('原图像'); subplot(1, 2, 2); imshow(output_img); title('滤波后的图像'); % 保存滤波后的图像 imwrite(output_img, 'output_image.png'); 注意:本代码仅供参考,实际应用中需要根据具体需求进行修改和优化。
好的,我可以帮您回答这个问题。不过需要说明的是,我是一个自然语言处理AI,无法直接运行 MATLAB 代码。我可以给您提供一些思路,帮助您完成这个问题。 首先,您需要编写 MATLAB 代码,实现自适应中值滤波器、传统中值滤波器和标准中值滤波器。这些滤波器的实现方式可以参考 MATLAB 自带的 medfilt2 函数。其中,自适应中值滤波器需要根据图像的局部方差动态调整滤波器的大小。 然后,您需要加载一张图片,并对其进行滤波处理。可以使用 MATLAB 自带的 imread 函数读入图片,使用您编写的滤波器对图片进行处理,然后使用 imwrite 函数将处理后的图片保存到本地。 最后,您需要使用 PSNR 和 SSIM 两个度量函数分别计算滤波前后的图像质量,并将结果输出到命令窗口。 以下是一个简单的示例代码,仅供参考: img = imread('lena.png'); % 读入图片 filter_size = 3; % 滤波器大小 % 自适应中值滤波器 img_adaptive = adaptive_median_filter(img, filter_size); % 传统中值滤波器 img_median = median_filter(img, filter_size); % 标准中值滤波器 img_standard = standard_median_filter(img, filter_size); % 计算 PSNR 和 SSIM psnr_adaptive = psnr(img, img_adaptive); ssim_adaptive = ssim(img, img_adaptive); psnr_median = psnr(img, img_median); ssim_median = ssim(img, img_median); psnr_standard = psnr(img, img_standard); ssim_standard = ssim(img, img_standard); % 输出结果 fprintf('自适应中值滤波器 PSNR: %.2f, SSIM: %.2f\n', psnr_adaptive, ssim_adaptive); fprintf('传统中值滤波器 PSNR: %.2f, SSIM: %.2f\n', psnr_median, ssim_median); fprintf('标准中值滤波器 PSNR: %.2f, SSIM: %.2f\n', psnr_standard, ssim_standard); % 保存结果图像 imwrite(img_adaptive, 'lena_adaptive.png'); imwrite(img_median, 'lena_median.png'); imwrite(img_standard, 'lena_standard.png'); 其中,adaptive_median_filter、median_filter 和 standard_median_filter 分别表示自适应中值滤波器、传统中值滤波器和标准中值滤波器的实现函数。psnr 和 ssim 分别表示计算 PSNR 和 SSIM 的函数。您需要根据自己的实现方式进行相应修改。

最新推荐

ssm数据结构课程网络学习平台的+vue毕业论文.doc

ssm数据结构课程网络学习平台的+vue毕业论文.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Objective-C中的协议与代理设计模式介绍

# 1. 理解Objective-C中的协议 协议是Objective-C中一种很重要的特性,它类似于其他编程语言中的接口,用来定义对象之间的通信规则和行为约定。在Objective-C中,协议可以帮助实现对象之间的松耦合和重用性。让我们深入了解Objective-C中的协议。 ## 1.1 什么是Objective-C中的协议? 在Objective-C中,协议是一组方法的声明,定义了一个对象可以遵循的接口。协议本身并不实现任何方法,而是规定遵循该协议的类需要实现协议中定义的方法。通过协议,可以在不同的类之间定义一组公共的行为和方法。 ## 1.2 协议的声明和使用方法 在Ob

编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求: C=m!/n!(m -n)!

好的,我可以编写这个函数。以下是代码示例: ```c++ #include <iostream> using namespace std; int f(int n) { if (n <= 1) { return 1; } else { return n * f(n - 1); } } int main() { int m, n; cout << "请输入两个整数m和n,以空格分隔:" << endl; cin >> m >> n; int C = f(m) / (f(n) * f(m - n));

视频中运动目标跟踪算法的研究.doc

视频中运动目标跟踪算法的研究.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Objective-C中的推送通知与APNs实现

# 1. 推送通知简介 推送通知是移动应用开发中常用的一种技术,它可以向用户发送消息、提醒或通知,即使用户并未在使用应用时也能及时获取重要信息。在Objective-C中,实现推送通知需要使用苹果提供的苹果推送通知服务(APNs)。本章将介绍推送通知的基础知识,包括推送通知的概念、作用和原理。接下来我们将深入了解。 ### 1.1 什么是推送通知 推送通知是通过网络将消息发送到设备的一种技术。应用程序可以向设备发送推送通知,无论用户当前是否在使用该应用,都可以及时获取到消息或通知。用户收到推送通知后,可以通过通知中的内容了解到消息的来源和内容,以便及时处理。 ### 1.2 推送通知的

php中,跳转语句有break和contimue

其实,`break`和`continue`并不是跳转语句,它们是用于控制循环语句的关键字。 `break`用于中断循环,跳出当前循环结构(如`for`、`while`、`do-while`),执行循环结构后面的语句。如果`break`语句后面跟着一个数字n,则表示跳出第n层循环。例如: ``` for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 10; $j++) { if ($j == 5) { break 2; // 跳出两层循环 } } } ``` `continue

IMO 涂层性能标准PSPC和执行指南PPT学习教案.pptx

IMO 涂层性能标准PSPC和执行指南PPT学习教案.pptx

关系数据表示学习

关系数据卢多维奇·多斯桑托斯引用此版本:卢多维奇·多斯桑托斯。关系数据的表示学习机器学习[cs.LG]。皮埃尔和玛丽·居里大学-巴黎第六大学,2017年。英语。NNT:2017PA066480。电话:01803188HAL ID:电话:01803188https://theses.hal.science/tel-01803188提交日期:2018年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaireUNIVERSITY PIERRE和 MARIE CURIE计算机科学、电信和电子学博士学院(巴黎)巴黎6号计算机科学实验室D八角形T HESIS关系数据表示学习作者:Ludovic DOS SAntos主管:Patrick GALLINARI联合主管:本杰明·P·伊沃瓦斯基为满足计算机科学博士学位的要求而提交的论文评审团成员:先生蒂埃里·A·退休记者先生尤尼斯·B·恩