使用Python和OpenCV实现自动光学错觉

2020-10-12 22:27:15

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

我最近在网上发现了一种很酷的视觉错觉,它可以让黑白图像看起来像彩色的。它通过在黑白图像上加一个彩色网格来达到这一目的,欺骗你的眼睛填充其余的颜色。你也可以在Google Colab上试用,而不需要下载任何代码。

让我们用python复制这一点。我们将使用打开的CV库将彩色图像转换为黑白图像,然后在上面绘制一些网格线。

由于我们使用的是Google CoLab,您可以通过单击左侧边栏上的文件夹按钮将图像上传到CoLab文件系统,或者运行url命令下载图像。

收到百分比总数%xferd平均速度时间当前负载上载总花费的左速度100 93698 100 93698 0 0 60921 0:00:01 0:00:01--:--:--60882。

这张图片是RGB格式的数组,所以维度是(H,W,C)。我们将使用CV2将其转换为黑白。CV2实际上读取的颜色是bgr,所以我们必须反转通道。

此外,由于黑白图像是1通道,但我们想要在黑白图像上绘制彩色线条,我们必须将其转换回3通道。

Bw_img=CV2。CvtColor(img[:,:,::-1],cv2.。COLOR_BGR2GRAY)#在给予CV2 bw_img=CV2之前将RGB反转为BGR。CvtColor(bw_img,cv2.。COLOR_GRAY2BGR)#返回到3通道PLT。图(FigSize=(5,5))PLT。Imshow(BW_IMG,Cmap=';Greys_r';)。

最后,这里是魔术发生的地方。我们将在图像上绘制网格线。您可以使用GRID_x_DIM和GRID_Y_DIM参数处理网格x和y维度上的线数。增加网格中的行数通常会使图像看起来更鲜艳。

GRID_IMG=BW_IMG。COPY()H、W、C=GRID_IMG。Shape grid_x_dim=100 grid_y_dim=100 thickness=1line_width=W/grid_x_dim line_high=H/grid_y_dim#为范围内的i绘制垂直线(Grid_X_Dim):对于范围内的j(Grid_Y_Dim):start_x,start_y=int(i*line_width),int(j*line_width)end_x,end_y=int(i*line_width),Int((j+1)*line_high)#确定颜色MID_x=INT(start_x+0.5*(end_x-start_x))MID_y=int(start_y+0.5*(end_y-start_y))MID_COLOR=img[MID_y,MID_x,:]。Tolist()#逐列,所以y,x color=MID_COLOR CV2。Line(grid_img,(start_x,start_y),(end_x,end_y),color,ickness,1)#为范围内的i画水平线(Grid_Y_Dim):对于范围内的j(Grid_X_Dim):start_x,start_y=int(j*line_width),int(i*line_width)end_x,end_y=int((j+1)*line_width),Int(i*line_Height)#确定颜色MID_x=INT(start_x+0.5*(end_x-start_x))MID_y=int(start_y+0.5*(end_y-start_y))MID_COLOR=img[MID_y,MID_x,:]。Tolist()#逐列,所以y,x color=MID_COLOR CV2。LINE(GRID_IMG,(start_x,start_y),(end_x,end_y),color,ickness,1)PLT。图(FigSize=(5,5))PLT。Imshow(GRID_IMG)。

让我们把这些图像并排比较一下。正如你所看到的,这个错觉不像原始图像那样充满活力,但它看起来肯定不是黑白的!

导入CV2导入matplotlib。Pylot as PLT将numpy导入为np def光学_幻觉(img_path,grid_dim=(75,75),line_thickness=3,show_all=false):";";";";img_path:输入图像的路径grid_dim:栅格的尺寸line_thickness:每条线的厚度show_all:并排渲染输入图像、光学错觉和BW图像。将RGB图像转换为BW图像,然后在其上绘制彩色网格线。可以调整栅格尺寸以及每条线的粗细。";";";GRID_x_DIM,GRID_Y_DIM=GRID_DIM厚度=LINE_THICTH IMG=PLT。Imread(Img_Path)bw_img=CV2。CvtColor(img[:,:,::-1],cv2.。COLOR_BGR2GRAY)BW_IMG=CV2。CvtColor(bw_img,cv2.。COLOR_GRAY2BGR)GRID_IMG=BW_IMG。COPY()W、H、C=GRID_IMG。Shape line_width=H/grid_x_dim line_high=W/grid_y_dim#为范围内的i绘制垂直线(grid_x_dim-1):对于范围内的j(grid_y_dim-1):start_x,start_y=int(i*line_width),int(j*line_width)end_x,end_y=int(i*line_width),Int((j+1)*line_high)#确定颜色MID_x=INT(start_x+0.5*(end_x-start_x))MID_y=int(start_y+0.5*(end_y-start_y))MID_COLOR=img[MID_y,MID_x,:]。Tolist()#逐列,所以y,x color=MID_COLOR CV2。Line(grid_img,(start_x,start_y),(end_x,end_y),color,ickness,1)#为范围内的i画水平线(grid_y_dim-1):对于范围内的j(grid_x_dim-1):start_x,start_y=int(j*line_width),int(i*line_width)end_x,end_y=int((j+1)*line_width),Int(i*line_Height)#确定颜色MID_x=INT(start_x+0.5*(end_x-start_x))MID_y=int(start_y+0.5*(end_y-start_y))MID_COLOR=img[MID_y,MID_x,:]。Tolist()#逐列,所以y,x color=MID_COLOR CV2。LINE(GRID_IMG,(start_x,start_y),(end_x,end_y),color,ickness,1)save_img=grid_img if show_all:save_img=np。串联([img,grid_img,bw_img],axis=1)返回save_img。

收到百分比总数%xferd平均速度时间100 146k 100 146k 0 0 113k 0 0:00:01 0:00:01 0:00:01--:-113k%收到%xferd平均速度时间当前负载上载总数%xferd平均速度时间100 127k 100 127k 0 227k 0-: