# Python和OpenCV图片傅里叶变换光线照射\_边框处理和Kmeans颜色量化

{% tabs %}
{% tab title="关键词" %}
Python | OpenCV | 傅里叶变换 | 光线照射 | Matplotlib | Numpy | Kmeans | 颜色量化 | Canny 边缘检测 | 同态滤波 | 高斯滤波 | 聚类
{% endtab %}

{% tab title="梗概" %}
OpenCV库是最著名的开源计算机视觉库，可用于许多编程语言。 凭借其丰富的功能，我们可以进行数字图像修改，例如几何变换，滤波，相机校准，特征提取，物体检测等。这里不会显示使用的安装和设置。

#### 像素处理

对于第一个问题，作为“ hello world”类型的问题，我们将访问图像并操纵其像素。

首先导入库。

```python
import cv2
```

要加载图像，我们使用imread函数，将要读取的文件的名称以及我们希望如何读取的参数作为参数传递：0-黑白，1-彩色，-1-不变。 对于此问题，我们将仅读取黑白和彩色。 为了显示与读取类似的图像，我们调用一个函数，该函数将要显示的窗口的名称及其内容作为参数传递，通常是我们调用imread创建的图像对象。

让我们读取黑白图像，访问其像素，更改一些像素并显示结果。 图像被加载为矩阵（每个元素一个像素），如果是灰度矩阵则具有二维，每个元素代表灰度强度。 如果是彩色的，则是代表颜色通道RGB的三个矩阵的集合。

```python
image = cv2.imread("lenna.png", 0)

for i in range(200, 210):
  for j in range(10, 200):
      image[i][j] = 0
      
cv2.imshow("image", image)
```

重要说明：在OpenCV中，矩阵的坐标不同。 水平坐标是Y，垂直坐标是X。此外，左上角是放置（0，0）原点的位置。 因此，坐标从左上角向左，向右和向下方向增长。 为了更容易理解，在使用名为X和Y的变量遍历坐标时，我们仅在访问位置时，更改为OpenCV表示法。

读取后，我们可以进行一些简单的矩阵访问并根据需要更改像素颜色。修改一些后，以某种方式将其制成矩形，将其显示为黑色。

这里需要一个非常有用的命令，因此我们可以使用相同的代码对图像进行多项操作。 waitKey等待用户按下一个键以继续输入代码。 参数0等待按下任何键以继续执行代码。 经过此处理后，我们再次读取Lenna的图像，但是这次是彩色的，并且像我们以前的黑色一样制作了一个红色矩形。

```python
cv2.waitKey(0)

image = cv2.imread("lenna.png", 1)

for i in range (200,210):
    for j in range(10,200):
        image[i, j] = [0, 0, 255]

cv2.imshow("janela", image)
cv2.waitKey(0) 
cv2.destroyAllWindows()
```

彩色图像的像素访问方式有所不同，我们传递给像素的数组以BGR顺序表示颜色通道（是的，无论出于何种原因，它都会被翻转）。 作为输出，我们在同一位置创建了一个最大的鲜红色矩形。

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6212cdc8-e3b0-42bd-a464-b779770d6fbd/Untitled.png)

最后，要销毁为显示图像而创建的窗口，我们调用函数destroyAllWindows，因此在程序停止运行后未显示任何内容。

现在，让我们用黑白图像的负数制作一个矩形。用户看出矩形的位置，会产生负面影响，即从像素的最大可能值中减去像素（此处为8位：255）。

```python
import cv2, sys

image = cv2.imread("lenna.png", 0)

for i in range(int(sys.argv[1]),int(sys.argv[2])):
    for j in range(int(sys.argv[3]),int(sys.argv[4])):
        image[i][j] = 255 - image[i][j] 

cv2.imshow("janela", image)    
cv2.waitKey(0)
cv2.destroyAllWindows()
```

运行坐标100、200、30和150：

我们将进一步探讨像素操作，以重新排列反转图像的四个象限。象限以正方形格式表示图像的1/4，就像将图片在垂直和水平方向上切成两半一样。

我们将进一步探讨像素操作，以重新排列反转图像的四个象限。象限以正方形格式表示图像的1/4，就像将图片在垂直和水平方向上切成两半一样。

对于这个挑战，我们将使用numpy库来简化矩阵的操作。 numpy函数split在给定位置和给定方向上拆分矩阵。 分割图像后，我们必须以翻转的顺序连接各个部分。

```python
import cv2
import numpy as np

image = cv2.imread("lenna.png", 0)

height, width = image.shape
#position to be splitted in half of the vertical and 0 for horizontal
[h,w] = np.split(image, [int(height/2)], 0)
#concatenate flipped in horizontal 
image = np.concatenate((w,h))
#position to be splitted in half of the hoizontal and 1 for vertical 
[h,w] = np.split(image,[int(width/2)], 1)
#concatenate flipped in vertical 
image = np.concatenate((w,h),1)

cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

#### 填充区域

在计算机视觉中，一项非常常见的任务是对检测到的场景中的对象进行计数。 感知物体对于检测属于每个物体的像素的聚集是必要的。 为了更好地工作，我们将使用二进制图片（仅灰度像素0和255），表示0为黑色背景，而1为对象像素。

### 使用傅里叶变换光线照射改善

### 源代码

### 图片边框处理

### Kmeans颜色量化
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
