鱼C论坛

 找回密码
 立即注册
楼主: ShuviDoura

[已解决]什么算法可以把图像的纹理特征转化为一个具体的数字

  [复制链接]
发表于 2024-7-15 09:56:03 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 09:55
这个意思是图像在转化为灰度图像之后,仍然是rgb三个 ...


你的理解有点小偏差,但总体方向是对的。我来详细解释一下:

### 灰度图像与RGB图像
- **RGB图像**:通常每个像素都有3个通道(红、绿、蓝),每个通道通常使用8位表示,这意味着每个像素需要24位。
- **灰度图像**:每个像素只有一个通道,表示亮度。通常使用8位来表示,这意味着每个像素只需要8位。

当你将一张彩色图片转换成灰度图像时,它确实变成了一个单通道的图像,不再有原来的RGB三个通道。因此,你的理解是对的,灰度图像确实只有一个通道。

### 为何要转化为8位整数
- 原始的图像数据在处理过程中,可能会进行各种计算和变换,这些操作有时会导致数据类型的变化。
- 在这种情况下,将数据类型转换为8位整数可以确保数据大小和范围符合预期,避免不必要的内存开销。

### 示例代码解析
假设你有一张灰度图像(已经实现了灰度化):
import numpy as np
from PIL import Image

# 假设 gray_np 是一个 numpy 数组,代表灰度图像的数据
gray_np = np.array([[100, 150, 200], [50, 100, 150], [200, 250, 255]])  # 举个例子

# 将灰度图像转换为 8 位整数(0-255)
gray_np = gray_np.astype(np.uint8)

# 使用 PIL 库将其转换为图像对象
gray_img = Image.fromarray(gray_np)

# 此时 gray_img 是一个 8 位灰度图像,可以显示或保存等操作
gray_img.show()  # 这行代码会显示图像

### 总结
- **灰度图像**实际上只有一个通道,而不是RGB的三个通道。
- **转换为8位整数**是为了确保图像数据存储高效,并且符合常见图像处理库的要求。
- 此外,使用8位整数还可以减少内存使用,提高程序的性能。

希望这个解释能帮你更好地理解这些操作的意义!如有其他问题,欢迎继续提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 09:58:48 | 显示全部楼层
那是否我在使用这个代码转灰度图之后,他得到的图像像素要不止有8位,所以才要改为8位,减小运算量
gray = img_path[:, :, 2] * r_weight + img_path[:, :, 1] * g_weight + img_path[:, :, 0] * b_weight# 将图像转换为灰度图
- **灰度图像**:每个像素只有一个通道,表示亮度。通常使用8位来表示,这意味着每个像素只需要8位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 09:59:13 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 09:58
那是否我在使用这个代码转灰度图之后,他得到的图像像 ...


你的理解是正确的。当我们处理图像时,将其转换为灰度图像并将像素数据转换为8位格式可以有效减少内存使用和计算复杂度。让我们更详细地讨论一下:

### 灰度图像与RGB图像
- **RGB图像**:每个像素有三个通道(红、绿、蓝),每个通道通常用8位表示,因此每个像素总共有24位。
- **灰度图像**:每个像素只有一个通道,表示亮度。通常用8位表示,因此每个像素只有8位。

### 为什么需要将图像转换为8位格式?
当你从RGB图像转换为灰度图像时,你可能会计算每个像素的亮度值,如下面的代码示例所示:
gray = img_path * r_weight + img_path * g_weight + img_path * b_weight  # 将图像转换为灰度图

转换后的灰度值理论上是一个浮点数,可能不在0到255的范围内。为了节省内存并提高计算效率,你需要将这些灰度值转换为8位无符号整数(`uint8`),每个像素占用一个字节。这一步通常是通过下面的代码完成的:
gray_np = gray.astype(np.uint8)  # 将灰度图转换为8位图像

### 这样做的意义
- **内存效率**:使用8位整数存储每个像素,可以有效减少内存使用。例如,一个1000x1000的图像,使用24位存储需要大约3MB内存,而使用8位存储只需要1MB。
- **计算效率**:在图像处理和计算机视觉任务中,使用8位图像可以显著减少计算量,加快处理速度。
- **兼容性**:许多图像处理库和硬件(如显示器和相机)都期望图像是8位格式的,便于直接处理和显示。

### 具体示例
假设你有一个RGB图像,你想将其转换为灰度图像,并确保每个像素是8位格式。可以这样做:
from PIL import Image
import numpy as np

# 打开图像
img = Image.open('path_to_your_image.jpg')
img = img.convert('RGB')  # 确保图像是RGB格式

# 转换为灰度图像
gray_img = img.convert('L')

# 将灰度图像转换为numpy数组
gray_np = np.array(gray_img)

# 确保灰度图像是8位格式
gray_np = gray_np.astype(np.uint8)

# 将numpy数组转换回PIL图像
final_gray_img = Image.fromarray(gray_np)

# 保存或显示图像
final_gray_img.save('gray_image.jpg')
final_gray_img.show()

这样处理后,你的灰度图像不仅仅是一个通道的图像,而且每个像素都被存储为8位无符号整数,确保了内存效率和计算效率。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:00:53 | 显示全部楼层
那我如果使用这个,是默认保存的八位还是浮点数
gray = cv2.cvtColor(img_path, cv2.COLOR_BGR2GRAY)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:01:07 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:00
那我如果使用这个,是默认保存的八位还是浮点数
gray ...


你使用 `cv2.cvtColor(img_path, cv2.COLOR_BGR2GRAY)` 转换图像为灰度图时,OpenCV 默认会将其转换为 8 位无符号整数(`uint8`)格式。因此,你得到的灰度图像每个像素占用一个字节(8 位)。这样既减小了内存使用,也优化了计算效率。

所以,不用担心,OpenCV 已经帮你把图像转换成了 8 位格式。如果你想确认转换后的数据类型,可以打印一下图像数组的 `dtype` 属性,比如:
import cv2

# 读取图像
img_path = 'path_to_your_image.jpg'
img = cv2.imread(img_path)

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 打印数据类型
print(gray.dtype)  # 预期输出: uint8

这段代码会告诉你图像现在的存储格式。你会看到输出是 `uint8`,确认了图像像素现在是 8 位表示了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:13:39 | 显示全部楼层
Traceback (most recent call last):
  File "C:\Users\shiro\Desktop\digital image\1.gray level.py", line 24, in <module>
    gray = cv2.cvtColor(img_path, cv2.COLOR_BGR2GRAY)#Gray=0.299×R+0.587×G+0.114×B
cv2.error: OpenCV(4.10.0) :-1: error: (-5:Bad argument) in function 'cvtColor'
> Overload resolution failed:
>  - src is not a numpy array, neither a scalar
>  - Expected Ptr<cv::UMat> for argument 'src'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:16:11 | 显示全部楼层
这是怎么回事
Traceback (most recent call last):
  File "C:\Users\shiro\Desktop\digital image\1.gray level.py", line 24, in <module>
    gray = cv2.cvtColor(img_path, cv2.COLOR_BGR2GRAY)#Gray=0.299×R+0.587×G+0.114×B
cv2.error: OpenCV(4.10.0) :-1: error: (-5:Bad argument) in function 'cvtColor'
> Overload resolution failed:
>  - src is not a numpy array, neither a scalar
>  - Expected Ptr<cv::UMat> for argument 'src'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:16:59 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:13
Traceback (most recent call last):
  File "C:\Use ...


看起来你的代码在执行 `cv2.cvtColor` 函数时,传入的 `img_path` 并不是一个 NumPy 数组,而是一个文件路径。你需要先读取图像文件,确保传给 `cvtColor` 函数的是一个正确的图像数组。

可以使用 `cv2.imread` 函数来读取图像文件。下面是一个完整的例子:
import cv2

# 读取图像文件
img_path = 'path_to_your_image.jpg'
image = cv2.imread(img_path)

# 检查图像是否成功读取
if image is None:
    print("Error: Could not read image.")
else:
    # 将图像转换为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 打印灰度图像的类型和数据类型
    print(f"Gray image type: {type(gray)}")
    print(f"Gray image dtype: {gray.dtype}")

    # 保存灰度图像(可选)
    cv2.imwrite('gray_image.jpg', gray)

    # 显示灰度图像(可选)
    cv2.imshow('Gray Image', gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

确保将 `img_path` 替换为实际图像文件的路径。这样,读取图像文件并转换为灰度图像后,灰度图像会默认存储为 8 位深度,每个像素值在 0 到 255 之间。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:22:11 | 显示全部楼层
这个要怎么改i
mport os
import cv2

# 设置输入和输出文件夹路径
input_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\import'  # 替换为你的输入文件夹路径
output_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\output'  # 替换为你的输出文件夹路径

if not os.path.exists(output_folder):
    os.makedirs(output_folder)


# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        img_path = os.path.join(input_folder, filename)
        if img_path is None:
            print("Error: Could not read image.")
        else:
        #img = Image.open(img_path).convert('L')  # 将图像转换为灰度图,采用Pillow
        #gray = img_path[:, :, 2] * r_weight + img_path[:, :, 1] * g_weight + img_path[:, :, 0] * b_weight# 将图像转换为灰度图
            img_path = img_path.open(img_path).convert('L')
            gray = cv2.cvtColor(img_path,cv2.COLOR_BGR2GRAY)#Gray=0.299×R+0.587×G+0.114×B


        gray_img_path = os.path.join(output_folder, filename)
        gray.save(gray_img_path)
        print(f"{filename} has been processed and saved.")

print("All images have been processed.")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:22:26 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:22
这个要怎么改i
mport os
import cv2

# 设置输入 ...


嘿,别急!我来告诉你怎么改这个代码。不用担心,这是很常见的问题。你需要先用 `cv2.imread` 读取图像文件,然后再转换为灰度图。这里是修改后的代码:
import os
import cv2

# 设置输入和输出文件夹路径
input_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\import'  # 替换为你的输入文件夹路径
output_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\output'  # 替换为你的输出文件夹路径

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        img_path = os.path.join(input_folder, filename)
        img = cv2.imread(img_path)  # 读取图像文件
        if img is None:
            print(f"Error: Could not read image {filename}.")
        else:
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图

            gray_img_path = os.path.join(output_folder, filename)
            cv2.imwrite(gray_img_path, gray)  # 保存灰度图像
            print(f"{filename} has been processed and saved.")

print("All images have been processed.")

解释一下:
1. 使用 `cv2.imread(img_path)` 从 `img_path` 路径读取图像,并返回一个 NumPy 数组。
2. 通过 `cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)` 将读取的彩色图像转换为灰度图。
3. 使用 `cv2.imwrite(gray_img_path, gray)` 保存灰度图像到指定路径。

不要忘了检查你的输入路径和输出路径是否正确哦!祝你编码快乐!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:34:59 | 显示全部楼层
分析一下这个代码
for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        img_path = os.path.join(input_folder, filename)
        img = cv2.imread(img_path)  # 读取图像文件
        if img is None:
            print(f"Error: Could not read image {filename}.")
        else:
            img_src = cv2.imread(img_path)
            img = cv2.resize(src=img_src, dsize=(450, 450))
            img = cv2.GaussianBlur(src=img, ksize=(5, 5), sigmaX=0, sigmaY=1.0)

            cv2.imshow('img_src', img_src)
            cv2.waitKey(0)
            cv2.destroyAllWindows() # 高斯滤波
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:35:27 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:34
分析一下这个代码
for filename in os.listdir(input ...


好的,我们来分析一下这段代码。

这段代码从一个输入文件夹中读取图像文件,并对每个图像进行处理。如果图像的文件名以 `.jpg` 或 `.png` 结尾,它会读取图像、调整图像大小、应用高斯模糊,并显示原始图像和处理后的图像。

具体步骤如下:

1. **遍历文件夹中的文件**:
  
for filename in os.listdir(input_folder):
    这行代码遍历 `input_folder` 中的所有文件。

2. **检查文件后缀名**:
  
if filename.endswith('.jpg') or filename.endswith('.png'):
    这行代码检查文件是否以 `.jpg` 或 `.png` 结尾。

3. **构造图像路径**:
  
img_path = os.path.join(input_folder, filename)
    这行代码构造图像文件的完整路径。

4. **读取图像**:
  
img = cv2.imread(img_path)  # 读取图像文件
    这行代码使用 OpenCV 的 `cv2.imread` 函数读取图像文件。

5. **检查图像是否成功读取**:
  
if img is None:
        print(f"Error: Could not read image {filename}.")
    如果图像读取失败,打印错误信息。

6. **处理图像**:
  
else:
        img_src = cv2.imread(img_path)
        img = cv2.resize(src=img_src, dsize=(450, 450))
        img = cv2.GaussianBlur(src=img, ksize=(5, 5), sigmaX=0, sigmaY=1.0)
    - 读取原始图像。
    - 使用 `cv2.resize` 函数将图像调整为 450x450 像素。
    - 使用 `cv2.GaussianBlur` 函数对图像应用高斯模糊。

7. **显示图像**:
  
cv2.imshow('img_src', img_src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    这几行代码显示原始图像,并在按下任意键后关闭显示窗口。

不过有几个需要注意的地方:
1. 你读取了两次图像(`img` 和 `img_src`),其实只需要一次。
2. 你没有保存处理后的图像到输出文件夹。

修改后的代码如下:
import os
import cv2

input_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\import'  # 替换为你的输入文件夹路径
output_folder = 'C:\\Users\\shiro\\Desktop\\digital image\\1.gray level picture\\output'  # 替换为你的输出文件夹路径

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        img_path = os.path.join(input_folder, filename)
        img = cv2.imread(img_path)  # 读取图像文件
        if img is None:
            print(f"Error: Could not read image {filename}.")
        else:
            img = cv2.resize(src=img, dsize=(450, 450))
            img = cv2.GaussianBlur(src=img, ksize=(5, 5), sigmaX=0, sigmaY=1.0)

            output_path = os.path.join(output_folder, filename)
            cv2.imwrite(output_path, img)  # 保存处理后的图像

            # 显示处理后的图像(可选)
            cv2.imshow('Processed Image', img)
            cv2.waitKey(0)
            cv2.destroyAllWindows()

print("All images have been processed.")

这样,处理后的图像会被保存到输出文件夹中,同时也会在窗口中显示出来。如果不需要显示,可以去掉 `cv2.imshow`、`cv2.waitKey` 和 `cv2.destroyAllWindows` 相关代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:36:57 | 显示全部楼层
这几句是什么意思
            img_src = cv2.imread(img_path)
            img = cv2.resize(src=img_src, dsize=(450, 450))
            img = cv2.GaussianBlur(src=img, ksize=(5, 5), sigmaX=0, sigmaY=1.0)

            cv2.imshow('img_src', img_src)
            cv2.waitKey(0)
            cv2.destroyAllWindows() # 高斯滤波
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:37:14 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:36
这几句是什么意思
            img_src = cv2.imread ...


好的,让我们逐行来看这几句代码到底在做什么:

1.
img_src = cv2.imread(img_path)
   这一行重复读取了图像。其实不需要,因为前面已经有一次 `cv2.imread(img_path)` 读取了图像,这里可以直接使用前面读取的 `img`。重复读取显得有点多余。

2.
img = cv2.resize(src=img_src, dsize=(450, 450))
   这一行是将图像的尺寸调整为 450x450 像素。不管你的图像原本是什么尺寸,它都会被缩放到这个固定尺寸。

3.
img = cv2.GaussianBlur(src=img, ksize=(5, 5), sigmaX=0, sigmaY=1.0)
   这一行对调整后的图像应用高斯模糊滤波器。`ksize` 是核的大小,这里是 5x5,`sigmaX` 和 `sigmaY` 是高斯滤波器在 X 和 Y 方向上的标准差。`sigmaX=0` 表示自动计算标准差,而 `sigmaY=1.0` 表示在 Y 方向上标准差为 1.0。

4.
cv2.imshow('img_src', img_src)
   cv2.waitKey(0)
   cv2.destroyAllWindows() # 高斯滤波
   这三行代码是用来显示原始图像(即 `img_src`),并等候用户按下任意键后关闭显示窗口。
   
   - `cv2.imshow('img_src', img_src)`:显示一个名为 'img_src' 的窗口,其中显示原始图像。
   - `cv2.waitKey(0)`:等待用户按下任意键。如果设置的时间参数为 0,则表示无限期等待。
   - `cv2.destroyAllWindows()`:销毁所有已创建的窗口。

总结一下,这段代码的作用是:
- 遍历输入文件夹,读取每个 JPG 或 PNG 图像。
- 将图像调整为 450x450 像素。
- 对调整后的图像应用高斯模糊滤波。
- 显示原始图像,并等待用户按键后关闭窗口。

可以根据实际需求优化和修改这段代码。例如,你可以去掉重复读取图像的部分。

希望这段解释能帮你更好地理解代码!另外,如果你有特定问题或需要进一步优化,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:52:24 | 显示全部楼层
这一步可以不做吗,固定为450, 450尺寸的意义是什么,可以是其他尺寸吗,可以不是正方形吗,设置成非正方形的其他尺寸有什么影像
img = cv2.resize(src=img, dsize=(450, 450))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 10:52:32 | 显示全部楼层
这一步可以不做吗,固定为450, 450尺寸的意义是什么,可以是其他尺寸吗,可以不是正方形吗,设置成非正方形的其他尺寸有什么影响
img = cv2.resize(src=img, dsize=(450, 450))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 10:52:45 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 10:52
这一步可以不做吗,固定为450, 450尺寸的意义是什么, ...


非常棒的问题!让我们逐一回答你的疑问。

### 1. 这一步可以不做吗?
`img = cv2.resize(src=img_src, dsize=(450, 450))`
这行代码将图像大小调整为 450x450 像素。如果你不在意图像的尺寸变化,或者说你的应用场景对图像尺寸没有特定要求,那么这一步可以省略。不调整大小意味着你会使用原始图像的尺寸,这在某些情况下也可能是合适的。

### 2. 固定为450x450尺寸的意义是什么?
将图像调整到固定尺寸(在这个例子中是 450x450)通常用于一些特定的需求,比如:
- **标准化输入**:在某些机器学习或计算机视觉任务中,需要所有输入图像具有相同的尺寸,以便统一处理。
- **优化处理速度**:通过将所有图像调整到较小的统一尺寸,可以减少计算量,加快处理速度。

### 3. 可以是其他尺寸吗?可以不是正方形吗?
是的!完全可以是其他尺寸,也可以不是正方形。例如,你可以将图像调整为 300x600 或 1280x720 等。具体的尺寸选择取决于你的实际需求和应用场景。

### 4. 设置成非正方形的其他尺寸有什么影响?
设置成非正方形的尺寸会有以下几个主要影响:
- **拉伸或压缩变形**:如果调整后的尺寸与原始图像的长宽比不同,图像会显得拉伸或压缩。
- **视觉效果**:变形可能会影响图像的视觉效果,可能难以识别其中的细节。
- **算法性能**:在某些机器学习模型中,变形图像可能会对性能产生影响,因为这些模型通常假设图像具有特定的比例。

举个例子,如果原始图像是 1000x500,你将其调整为 450x450,那么该图像会被拉伸以适应新的尺寸,这会导致失真。如果你将其调整为 450x225,则不会出现失真问题,但图像的内容显示比例会有所改变。

总的来说,调整图像尺寸需要根据具体情况进行权衡。希望这些解释能帮你更好地理解这段代码的作用!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 11:04:54 | 显示全部楼层
这里哪一行是输出的图片大小
import os
import cv2
import numpy as np
from glob import glob

np.set_printoptions(threshold=np.inf, linewidth=np.inf)
def calculate_coarseness(image, kmax=5):
    h, w = image.shape
    average_gray = np.zeros((kmax, h, w))
    print(h,w)
    for k in range(kmax):
        window_size = 2 ** k
        kernel = np.ones((window_size, window_size), dtype=np.float64) / (window_size ** 2)
        average_gray[k] = cv2.filter2D(image, -1, kernel)
        #print("kernel=",kernel)
   #print("average_gray[k[0]]=", average_gray[k][0])
    #image为图片,
    # -1为深度,也可以是cv2.CV_16S`, `cv2.CV_32F

    Sbest = np.zeros((h, w))

    for k in range(1, kmax):
        #print("average_gray[k[0]]=",average_gray[k][:h - 2 ** k, :])
        #print("dsdsdss===",average_gray[k][:h - 2 ** k, :] )
        Sv = np.abs(average_gray[k][:h - 2 ** k, :] - average_gray[k][2 ** k:, :])
        Sh = np.abs(average_gray[k][:, :w - 2 ** k] - average_gray[k][:, 2 ** k:])
        Sbest_temp = np.maximum(Sv[:h - 2 ** k, :w - 2 ** k], Sh[:h - 2 ** k, :w - 2 ** k]) * (2 ** k)
        Sbest[:h - 2 ** k, :w - 2 ** k] = np.maximum(Sbest[:h - 2 ** k, :w - 2 ** k], Sbest_temp)

    return np.mean(Sbest)


def calculate_contrast(image):
    mean = np.mean(image)
    variance = np.mean((image - mean) ** 2)
    std_dev = np.sqrt(variance)
    return std_dev


def batch_process_images(folder_path):
    image_files = glob(os.path.join(folder_path, "*.jpg")) + \
                  glob(os.path.join(folder_path, "*.png")) + \
                  glob(os.path.join(folder_path, "*.jpeg"))

    results = []

    for image_file in image_files:
        image = cv2.imread(image_file, cv2.IMREAD_GRAYSCALE)
        coarseness = calculate_coarseness(image)
        contrast = calculate_contrast(image)
        results.append({
            'file': image_file,
            'coarseness': coarseness,
            'contrast': contrast
        })
        #print(f"Processed {image_file}: Coarseness={coarseness}, Contrast={contrast}")
        #print("contrast",contrast)

    #for x in range(200):
        #print(x)
    return results


# 使用示例:
folder_path = "C:\\Users\\shiro\\Desktop\\digital image\\2.0 GaussianBlur"
results = batch_process_images(folder_path)
print("All images processed.")

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 11:06:07 | 显示全部楼层
ShuviDoura 发表于 2024-07-15 11:04
这里哪一行是输出的图片大小
import os
import cv2
...


您的代码片段主要是计算图像的纹理特征(coarseness和contrast),其中没有一行直接输出图像大小。不过,如果您想查看每个图像的大小,可以在读取图像后打印其形状。

### 修改后的代码
增加打印图像大小的代码,让我们可以看到每个图像的大小:
import os
import cv2
import numpy as np
from glob import glob

np.set_printoptions(threshold=np.inf, linewidth=np.inf)

def calculate_coarseness(image, kmax=5):
    h, w = image.shape
    average_gray = np.zeros((kmax, h, w))
    print(h,w)  # 这会打印出图像的高度和宽度
    for k in range(kmax):
        window_size = 2 ** k
        kernel = np.ones((window_size, window_size), dtype=np.float64) / (window_size ** 2)
        average_gray = cv2.filter2D(image, -1, kernel)

    Sbest = np.zeros((h, w))

    for k in range(1, kmax):
        Sv = np.abs(average_gray - average_gray)
        Sh = np.abs(average_gray - average_gray)
        Sbest_temp = np.maximum(Sv, Sh) * (2 ** k)
        Sbest = np.maximum(Sbest, Sbest_temp)

    return np.mean(Sbest)

def calculate_contrast(image):
    mean = np.mean(image)
    variance = np.mean((image - mean) ** 2)
    std_dev = np.sqrt(variance)
    return std_dev

def batch_process_images(folder_path):
    image_files = glob(os.path.join(folder_path, "*.jpg")) + \
                  glob(os.path.join(folder_path, "*.png")) + \
                  glob(os.path.join(folder_path, "*.jpeg"))

    results = []

    for image_file in image_files:
        image = cv2.imread(image_file, cv2.IMREAD_GRAYSCALE)
        if image is not None:
            print(f"Image size (HxW): {image.shape[0]}x{image.shape[1]}")  # 打印图像大小
            coarseness = calculate_coarseness(image)
            contrast = calculate_contrast(image)
            results.append({
                'file': image_file,
                'coarseness': coarseness,
                'contrast': contrast
            })
        else:
            print(f"Failed to load image: {image_file}")

    return results

# 使用示例:
folder_path = "C:\\Users\\shiro\\Desktop\\digital image\\2.0 GaussianBlur"
results = batch_process_images(folder_path)
print("All images processed.")

### 解释:
1. 在`batch_process_images`函数内,读取图像文件后,通过 `image.shape` 获取图像的高度和宽度,并打印出来。
2. 增加了一个检查,如果读取图像失败,则打印警告信息。

这样做可以帮助您了解每个图像的大小。如果您有任何进一步的问题或需要更多解释,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-15 15:14:45 | 显示全部楼层
这是什么问题
C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\__init__.py:142: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL initialization ensuring its correct out-of-the box operation under condition when Gnu OpenMP had already been loaded by Python process is not assured. Please install mkl-service package, see http://github.com/IntelPython/mkl-service
  from . import _distributor_init
OpenCV bindings requires "numpy" package.
Install it via command:
    pip install numpy
Traceback (most recent call last):
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\core\__init__.py", line 23, in <module>
    from . import multiarray
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\core\multiarray.py", line 10, in <module>
    from . import overrides
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\core\overrides.py", line 6, in <module>
    from numpy.core._multiarray_umath import (
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "detect.py", line 20, in <module>
    import cv2
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\cv2\__init__.py", line 11, in <module>
    import numpy
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\__init__.py", line 144, in <module>
    from . import core
  File "C:\Users\shiro\Desktop\01\conda\envs\sd01\lib\site-packages\numpy\core\__init__.py", line 49, in <module>
    raise ImportError(msg)
ImportError:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.8 from "C:\Users\shiro\Desktop\01\conda\envs\sd01\python.exe"
  * The NumPy version is: "1.22.3"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-17 02:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表