🥥Python和OpenCV图片傅里叶变换光线照射_边框处理和Kmeans颜色量化
Python | OpenCV | 傅里叶变换 | 光线照射 | Matplotlib | Numpy | Kmeans | 颜色量化 | Canny 边缘检测 | 同态滤波 | 高斯滤波 | 聚类
OpenCV库是最著名的开源计算机视觉库,可用于许多编程语言。 凭借其丰富的功能,我们可以进行数字图像修改,例如几何变换,滤波,相机校准,特征提取,物体检测等。这里不会显示使用的安装和设置。
像素处理
对于第一个问题,作为“ hello world”类型的问题,我们将访问图像并操纵其像素。
首先导入库。
import cv2
要加载图像,我们使用imread函数,将要读取的文件的名称以及我们希望如何读取的参数作为参数传递:0-黑白,1-彩色,-1-不变。 对于此问题,我们将仅读取黑白和彩色。 为了显示与读取类似的图像,我们调用一个函数,该函数将要显示的窗口的名称及其内容作为参数传递,通常是我们调用imread创建的图像对象。
让我们读取黑白图像,访问其像素,更改一些像素并显示结果。 图像被加载为矩阵(每个元素一个像素),如果是灰度矩阵则具有二维,每个元素代表灰度强度。 如果是彩色的,则是代表颜色通道RGB的三个矩阵的集合。
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的图像,但是这次是彩色的,并且像我们以前的黑色一样制作了一个红色矩形。
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顺序表示颜色通道(是的,无论出于何种原因,它都会被翻转)。 作为输出,我们在同一位置创建了一个最大的鲜红色矩形。
最后,要销毁为显示图像而创建的窗口,我们调用函数destroyAllWindows,因此在程序停止运行后未显示任何内容。
现在,让我们用黑白图像的负数制作一个矩形。用户看出矩形的位置,会产生负面影响,即从像素的最大可能值中减去像素(此处为8位:255)。
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在给定位置和给定方向上拆分矩阵。 分割图像后,我们必须以翻转的顺序连接各个部分。
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颜色量化
Last updated