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

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为对象像素。

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

源代码

图片边框处理

详情参阅 - 亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值