优化from PIL import Image def got_RGB(img_path): img = Image.open(img_path) width, height = img.size img = img.convert('RGB') sum = 0 for i in range(width): for j in range(height): r, g, b = img.getpixel((i, j)) if r!= 0: s=200 f=578 t=f*s/r sum=sum+t print(t) print(sum)
时间: 2024-02-14 18:25:20 浏览: 69
这段代码从给定的图像文件路径中读取图,并计算图像中非零素的 RGB 值之和首先,通过 `Image.open()` 函数打开像文件,并获取图像的宽度和高度。后,使用 `convert('RGB')` 将图像转换为 RGB 模式,以便在后续操作中获取每个像素点的 RGB 值。
接下来,通过嵌套的循环遍历图像的每个像素点。使用 `getpixel()` 函数获取当前像素点的 RGB 值,并将其分别赋值给变量 `r`、`g` 和 `b`。
在条件判断 `if r != 0` 中,如果红色分量 `r` 不等于零,则执行以下操作:
1. 定义变量 `s` 和 `f` 分别为200和578。
2. 计算变量 `t` 的值,通过将 `f * s` 除以 `r`。
3. 将变量 `t` 的值累加到变量 `sum` 中。
4. 打印变量 `t` 的值。
最后,循环结束后,打印变量 `sum` 的值,表示所有非零像素的 RGB 值之和。
需要注意的是,代码中的打印语句 `print(t)` 是在每次迭代中打印当前像素点的计算结果。
相关问题
优化该段代码import numpy as np from PIL import Image def white_balance(image_path): img = Image.open(image_path).convert('RGB') img_np = np.array(img) r, g, b = np.mean(img_np[:, :, 0]), np.mean(img_np[:, :, 1]), np.mean(img_np[:, :, 2]) avg = (r + g + b) / 3 img_np[:, :, 0] = np.minimum(img_np[:, :, 0] * (avg / r), 255) img_np[:, :, 1] = np.minimum(img_np[:, :, 1] * (avg / g), 255) img_np[:, :, 2] = np.minimum(img_np[:, :, 2] * (avg / b), 255) new_img = Image.fromarray(np.uint8(img_np)) return new_img并且保存图像
可以尝试以下优化:
1. 使用 `np.mean()` 计算图片的平均值,可以使用 `np.average()` 或者 `np.mean(axis=(0,1))` 代替,后者可以减少一个维度的计算,提高效率。
2. 在计算 `avg` 时,可以使用 `np.mean()` 计算三个通道的平均值,这样可以减少一次加法计算,提高效率。
3. 对于数组的运算,可以使用 NumPy 提供的函数,如 `np.multiply()`,这样可以利用 NumPy 的向量化计算,提高效率。
4. 在创建新的图片时,可以指定图片的格式,如 `Image.fromarray(np.uint8(img_np), mode='RGB')`,这样可以减少类型转换的时间。
优化后的代码如下:
```python
import numpy as np
from PIL import Image
def white_balance(image_path):
img = Image.open(image_path).convert('RGB')
img_np = np.array(img)
avg = np.mean(img_np, axis=(0,1))
img_np[:,:,0] = np.minimum(np.multiply(img_np[:,:,0], avg[1]/avg[0]), 255)
img_np[:,:,1] = np.minimum(np.multiply(img_np[:,:,1], avg[1]/avg[1]), 255)
img_np[:,:,2] = np.minimum(np.multiply(img_np[:,:,2], avg[1]/avg[2]), 255)
new_img = Image.fromarray(np.uint8(img_np), mode='RGB')
new_img.save('new_image.jpg')
return new_img
```
优化使得每检索50张照片,输出一次已检索文件数:import os from PIL import Image from multiprocessing import Pool def is_black_image(file_path): with Image.open(file_path) as img: pixels = list(img.getdata()) if all(sum(pixel) == 0 for pixel in pixels): return True else: return False def delete_black_images(file_path): if is_black_image(file_path): os.remove(file_path) print('{} has del'.format(file_path)) def batch_delete_black_images(folder_path): file_list = [] for f in os.listdir(folder_path): file_path = os.path.join(folder_path, f) if os.path.isfile(file_path): file_list.append(file_path) with Pool() as p: p.map(delete_black_images, file_list) if __name__ == '__main__': batch_delete_black_images(r'F:\H18\Dfinal640.tif\8-2')
为了每检索50张照片输出一次已检索文件数,您可以在 `batch_delete_black_images` 函数中添加一个计数器来实现。具体地,您可以在函数中添加一个变量 `count`,每删除一张黑色图片时,将计数器加1,并且当计数器能够被50整除时,打印当前已经检索的文件数。下面是修改后的代码:
```
import os
from PIL import Image
from multiprocessing import Pool
def is_black_image(file_path):
with Image.open(file_path) as img:
pixels = list(img.getdata())
if all(sum(pixel) == 0 for pixel in pixels):
return True
else:
return False
def delete_black_images(file_path):
if is_black_image(file_path):
os.remove(file_path)
print('{} has del'.format(file_path))
return True
return False
def batch_delete_black_images(folder_path):
file_list = []
count = 0
for f in os.listdir(folder_path):
file_path = os.path.join(folder_path, f)
if os.path.isfile(file_path):
file_list.append(file_path)
with Pool() as p:
results = p.map(delete_black_images, file_list)
for result in results:
if result:
count += 1
if count % 50 == 0:
print('已检索 {} 个文件'.format(count))
if __name__ == '__main__':
batch_delete_black_images(r'F:\H18\Dfinal640.tif\8-2')
```
注意,为了避免多个进程同时打印计数器的值,我们在每50次删除操作后只打印计数器的值,而不是实时打印。
阅读全文