需要一个做出镂空图片的程序

这相当于把一张图片A与一个全黑B(或全白W)图叠加在一起,形成图C。但叠加的方式如下:
设C图有2560x1080个像素,C轮番=A或B。

像素关系是这样的:
在第一行里,图C第一个像素等于图A的对应位置像素后,下一个相邻的对应像素就与B对应位置的像素相等,C图像素就这样交替与A和B对应像素相等,一直到行末。

换行后,第一个C像素与对应位置的B像素相等,然后下一个像素与A图对应位置像素相等,就这样交替,直到行末。

就这样,每行的第一个像素交替与A,B图相应位置的像素相同,直到最后一行。

第一行
c₁₁=a₁₁,c₁₂=b₁₂,c₁₃=a₁₃,c₁₄=b₁₄…… c₁ ₂₅₆₀=b₁ ₂₅₆₀


第1080行
c₁₀₈₀ ₁=b₁₀₈₀ ₁,c₁₀₈₀ ₂=a₁₀₈₀ ₂,… c₁₀₈₀ ₂₅₆₀=a₁₀₈₀ ₂₅₆₀

最后,
print C.

能请哪位编一个么?

是这种效果吗?

img


代码:

from PIL import Image
 
im_a = Image.open(r'A.png')
im_b = Image.open(r'B.png')
pix_a = im_a.load()
pix_b = im_b.load()
width_a=im_a.size[0]
width_b=im_b.size[0]
height_a=im_a.size[1]
height_b=im_b.size[1]
width_c=min(width_a,width_b)
height_c=min(height_a,height_b)
result_image = Image.new('RGB', (width_c,height_c), (0,0,0))
for y in range(height_c):
    for x in range(width_c):
        if (x%2==0 and y%2==0) or (x%2==1 and y%2==1):
            temp = im_a
        else:
            temp = im_b
        r,g,b = temp.getpixel((x,y))
        result_image.putpixel((x,y),(r,g,b))
result_image.save(r'C.png')

最容易理解的方法:

import cv2
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
    imgA = cv2.imread("../images/test01.png", flags=0)  # 灰度图像
    rows, cols = imgA.shape

    imgB = np.zeros((rows, cols), np.uint8)  #  # 创建黑色图像, 全 0 矩阵
    # imgB = np.ones(rows, cols, np.uint8)*255  #  # 创建白色图像, 全 1 矩阵
    imgC = imgA.copy()  #  以图像 A 作为模板

    for j in range(rows):
        for i in range(cols):
            if (i+j)%2==1:  # 奇数
                imgC[j, i] = imgB[j ,i]

    plt.figure(figsize=(9, 6))
    plt.subplot(131), plt.axis('off'), plt.title("imgA")
    plt.imshow(imgA, "gray")
    plt.subplot(132), plt.axis('off'), plt.title("imgB")
    plt.imshow(imgB, "gray")
    plt.subplot(133), plt.axis('off'), plt.title("imgC")
    plt.imshow(imgC, "gray")
    plt.tight_layout()
    plt.show()

最高效的方法:

    import numpy as np
    # 读取图像 A,例程以随机数图像为例
    imgA = np.random.randint(0, 255, size=(64, 64))
 
    
    # 图像B 为全黑 (B=0) 时的处理方法
    B= 0
    imgC = imgA.copy()
    imgC[::2, 1::2] = B  # 隔行隔列置 B=0
    imgC[1::2, ::2] = B
 
    # 图像B 为全白 (B=255) 时的处理方法
    B = 255
    imgD = imgA.copy()
    imgD[::2, 1::2] = B  # 隔行隔列置 B=255
    imgD[1::2, ::2] = B

    # 彩色图像按照 三通道 处理即可

img

img

为什么楼上都要转成灰度的,题主没说啊


import cv2
path1='D:/ZZF/addcode/a.jpg' ##a图片的路径

a=cv2.imread(path1)
r,c,h=a.shape
for i in range(r):
    for j in range(c):
        if (i+j)%2==1: 
            a[i][j]=[0,0,0] ##全黑,全白是[255,255,255]
cv2.imshow("image", a)

用Java可以吗?

from PIL import Image
import numpy as np

img1 = Image.open(r'color.png')
img2 = Image.open(r'gray.png')

arr1 = np.array(img1)
arr2 = np.array(img2)

arr = np.asarray(arr1)

for i in range(len(arr1)):
    for j in range(0,len(arr1[0]),2):
        if i%2==0:
            arr[i][j],arr[i][j+1] = arr1[i][j+1],arr2[i][j]
        else:
            arr[i][j],arr[i][j+1] = arr2[i][j+1],arr1[i][j]

img = Image.fromarray(np.uint8(arr))

img.save(r'halfcolor.png')
img.show()

img

img

img

最容易理解的方法就是循环遍历每一行每一列,偶数行奇数列改变颜色,奇数行偶数列改变颜色:

import cv2
img = cv2.imread('11.jpg')
for i in range(img.shape[0]):
    for r in range(img.shape[1]):
        if i%2==0 and r%2==1:
            img[i][r] = [0,0,0] #白色用[255,255,255]
        elif i%2==1 and r%2==0:
            img[i][r] = [0,0,0] #白色用[255,255,255]
cv2.imshow('img', img)
cv2.waitKey(0)

img

参考

from PIL import Image
img = Image.open(r'D:11.jpg')
img = img.convert('RGBA') # 转为RGBA模式,红+绿+蓝+Alpha透明的颜色。
width,height = img.size#获取图片尺寸
array = img.load() # 获取图片像素操作入口
for i in range(width):#遍历图片的所有像素
    for j in range(height):
        pos = array[i,j] # 获得某个像素点,格式为(R,G,B,A)元组
        isEdit = (sum([1 for x in pos[0:3] if x > 240]) == 3)#乳白色的RGB值是:(255,251,240),所以判断值设置为240
        if isEdit:
            # 更改为透明
            array[i,j] = (255,255,255,0)

# 保存图片,位置在c盘用户名目录下
img.save('NEWIMG.png')


img

过来蹲一下,这个不太擅长,但看到题主的题目感觉挺有兴趣的。我也学习一下。
其实我刚刚想到了学习的思路,但不晓得适不适用解题。
我想着直接上百度,看有没有相似的题目,再参考别人的解决思路,或许就可以解题了。
不过吧重点还是需要先学会别人的解题思路。

非常感谢各位答主。这是我们设想的一个付费学python的项目。我们主要要学习如何用最容易被程序员理解的文字把一个需求写清楚,最好能做到使程序员只需要把我们写的文字流程用Python语句替代了就好。这需要我们也更多地了解python语句,使我们能读懂程序,以及在写一个需求的文字流程时尽可能让编程人员容易理解和实现。

这次回答中有不少尽量做简洁的努力。学习了。但我们用两幅图的像素组成一幅图的做法是需要坚持的, 虽然B图只是全黑或全白图。有一个思路好像可行,使程序简单,但也符合两图合并的要求。就是对A,B两图,以任意一个图为底图,对其奇数行的偶数点,或偶数行的奇数点,令其等于另外一张图的同样位置像素点的内容。这样,无论是以全黑图为底,风景图为替换像素用图,还是反过来,视觉效果应该是一样的,最多有了一个像素的错位。

原答可以修改一下么?用作显示效果的图请用彩色的,最好是人像+风景的,背景避免单色。图幅尽量大些,能放到全屏演示而不颗粒粗的。谢谢关注! 谢谢各个答案。 另外,文字注释能全些就更好了。