使用Jupyter给图像任意位置添加“lena”的文字水印
时间: 2023-12-12 18:05:16 浏览: 67
首先,我们需要安装 Pillow 库,可以使用以下命令进行安装:
```
!pip install Pillow
```
然后,我们可以使用以下代码将 "lena" 文字水印添加到图像的任意位置:
```python
from PIL import Image, ImageDraw, ImageFont
# 打开图像文件
image = Image.open("image.jpg")
# 设置水印文字
text = "lena"
font = ImageFont.truetype("arial.ttf", 36)
# 获取绘图对象
draw = ImageDraw.Draw(image)
# 获取图像大小
image_width, image_height = image.size
# 获取水印文字大小
text_width, text_height = draw.textsize(text, font)
# 设置水印位置
x = image_width - text_width - 10
y = image_height - text_height - 10
# 绘制水印
draw.text((x, y), text, font=font)
# 保存图像
image.save("image_with_watermark.jpg")
```
需要注意的是,这里使用了 Arial 字体,如果你的系统中没有安装 Arial 字体,则需要更改字体文件路径或者使用其他字体。
相关问题
帮我写一个matlab程序来仿真实现“基于DCT域和DWT域的彩色图像自适应嵌入的双功能水印算法”,其中彩色图像用"Lena"图像,一个水印图像是根据“"Lena"图像的特征提生成的可以用与图像认证的水印图像,另一个水印图像是黑白图像"Cameraman"
在MATLAB中实现这个双功能水印算法涉及到信号处理和图像分析的知识,以下是简化的步骤和部分代码示例。请注意,完整代码将比这长得多,因为我们需要导入图像、进行离散余弦变换(DCT)、小波变换(DWT)、嵌入水印以及验证水印等步骤。这里我会提供关键部分的代码框架:
```matlab
% 1. 导入图像
lena = imread('Lena.png'); % 彩色 Lena 图像
cameraman = imread('cameraman.tif'); % 黑白 Cameraman 图像
% 2. 转换到灰度图像 (如果你的Lena是RGB)
if size(lena, 3) == 3
lena_gray = rgb2gray(lena);
end
% 3. 创建水印图像 (这里假设我们简单地创建了一个由Lena特征提取的二值图像)
watermark = ...; % 根据Lena的特征提取并转换成适合嵌入的二值图像
% 4. DCT & DWT
dct_lena = dct(double(lena_gray)); % 对灰度Lena进行DCT
[dwt_coeff, level] = wavedec(lena_gray, 'db4', 2); % DWT分解Lena图像
% 5. 嵌入水印
% - 基于DCT域的嵌入:
dct_watermarked = dctcoeff(dct_lena, watermark); % 将水印添加到DCT系数中
% - 基于DWT域的嵌入:
dwt_watermarked = insertWatermark(dwt_coeff, watermark, level); % 自定义函数插入水印
% 6. 恢复图像 (DCT和DWT逆操作)
lena_dct_watermarked = idct(double(dct_watermarked));
lena_dwt_watermarked = waverec(dwt_watermarked, 'db4', level);
% 7. 存储和显示结果 (这只是保存图片,你可以选择只看中间结果)
imwrite(lena_dct_watermarked, 'lena_dct_watermarked.jpg');
imwrite(lena_dwt_watermarked, 'lena_dwt_watermarked.jpg');
%
利用jupyter进行图像幂次变换,并绘画幂次变换函数图
幂次变换是一种常见的图像处理技术,它通过对图像的像素值进行指数运算来改变图像的亮度和对比度。在Jupyter中,可以使用Python的NumPy和Matplotlib库来进行图像幂次变换和绘制幂次变换函数图。
下面是一个示例代码,使用幂次变换将一张灰度图像的像素值进行指数运算并绘制幂次变换函数图。
首先,我们需要导入NumPy和Matplotlib库,并读取一张灰度图像。这里我选择使用scikit-image库中自带的一张灰度图像"Lena"。
```python
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
# 读取灰度图像
img = data.camera()
```
接下来,我们可以定义一个幂次变换函数,将输入的像素值进行指数运算并返回结果。这里我选择指数为2.0,也就是进行平方运算。
```python
def power_law_transform(img, gamma=2.0):
# 进行幂次变换
img_transformed = np.power(img / float(np.max(img)), gamma)
# 将像素值缩放到[0, 255]范围内
img_transformed = np.uint8(img_transformed * 255)
return img_transformed
```
然后,我们可以调用幂次变换函数,对图像的像素值进行指数运算,并绘制幂次变换函数图。这里我选择绘制指数为2.0和0.5的幂次变换函数图。
```python
# 进行幂次变换
img_transformed1 = power_law_transform(img, gamma=2.0)
img_transformed2 = power_law_transform(img, gamma=0.5)
# 绘制幂次变换函数图
x = np.linspace(0, 1, 256)
y1 = np.power(x, 2.0)
y2 = np.power(x, 0.5)
plt.plot(x, y1, 'r', label='gamma=2.0')
plt.plot(x, y2, 'b', label='gamma=0.5')
plt.legend(loc='upper left')
plt.xlabel('Input Intensity')
plt.ylabel('Output Intensity')
plt.show()
```
最后,我们可以将原始图像和进行幂次变换后的图像进行展示,以比较它们的差异。
```python
# 展示图像和幂次变换函数图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))
ax = axes.ravel()
ax[0].imshow(img, cmap='gray')
ax[0].set_title("Original Image")
ax[1].imshow(img_transformed1, cmap='gray')
ax[1].set_title("Gamma=2.0")
ax[2].imshow(img_transformed2, cmap='gray')
ax[2].set_title("Gamma=0.5")
ax[3].plot(x, y1, 'r', label='gamma=2.0')
ax[3].plot(x, y2, 'b', label='gamma=0.5')
ax[3].set_title("Power Law Transform Function")
ax[3].set_xlabel('Input Intensity')
ax[3].set_ylabel('Output Intensity')
ax[3].legend(loc='upper left')
plt.tight_layout()
plt.show()
```
运行以上代码,可以得到如下结果:
![image](https://user-images.githubusercontent.com/52484457/128902232-17c3a9d9-3e3a-4b19-bfc2-546d8c31a1b1.png)
从结果中可以看出,幂次变换能够改变图像的亮度和对比度,使得图像的细节更加突出。通过绘制幂次变换函数图,我们可以更加直观地理解幂次变换的作用。
阅读全文