首页 > 编程问答 >Python OpenCV - 显示坏像素检查测试

Python OpenCV - 显示坏像素检查测试

时间:2024-07-30 06:47:33浏览次数:13  
标签:python python-3.x opencv machine-learning computer-vision

我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为 160x320 像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有 51200 像素,那就是坏的。另外,我想知道每个坏像素的位置。

一旦拍摄的图像太大,我将共享一个谷歌驱动器共享文件夹,其中包含良好显示器和包含坏像素的坏显示器的示例。

显示图像| ||你能帮我怎么做吗?我想用 opencv 在 python 中执行此操作。

提前感谢

我尝试通过检测到的对象的轮廓进行评估,它可以工作,但前提是所有像素都存在。如果一个像素丢失并且没有检测到轮廓,我可以知道一个像素丢失,但我无法知道它的位置。

所以我认为最好的解决方案是跟踪网格并评估每个像素网格的单元格。

这是我当前的代码:

Here is my current code:

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

def getColor(area):
    if area > 70:
        return (255, 0, 0)
    if area < 14:
        return (0, 0, 255)
    return (255, 255, 0)

def test_green_pattern():

    mask = cv2.imread("masks/mask.bmp", 0)
    green = cv2.imread("images/green-good.bmp")

    green_W = cv2.addWeighted(green, 3, green, 0, 1)

    gray = cv2.cvtColor(green_W, cv2.COLOR_BGR2GRAY)

    masked = cv2.bitwise_and(gray, gray, mask=mask)
    cv2.imwrite("try/green-masked.bmp", masked)
    # Real threshold = 120
    ret, thresh = cv2.threshold(masked, 120, 255, cv2.THRESH_BINARY)
    cv2.imwrite("try/green-threshold.bmp", thresh)

    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    print("Green Pattern Pixels:", len(contours))
    areas = []
    perimeters = []
    bad = 0
    prob_double = 0
    qtd = 0
    for i, contour in enumerate(contours):
        area = area = cv2.contourArea(contour)
        areas.append(area)
        perimeter = cv2.arcLength(contour,True)
        perimeters.append(perimeter)
        color = getColor(area)

        if area < 14:   
            bad += 1
            qtd += 1
            x, y, width, height = cv2.boundingRect(contour)
            roi = green[y:y+height, x:x+width]
            cv2.imwrite("try/temp/"+str(i)+".bmp", roi) 
            cv2.drawContours(green, contour, -1, color, 1)
            cv2.drawContours(green_W, contour, -1, color, 1)
        if area > 90:   
            prob_double += 1
            qtd += 2
            cv2.drawContours(green, contour, -1, color, 1)
            cv2.drawContours(green_W, contour, -1, color, 1)
        else:
            qtd += 1
    #get_statistics(areas, perimeters)
    print("Total:",qtd)
    print("Probably double pixel:", prob_double)
    print("Bad pixels:", bad)
    cv2.imwrite("try/green-contours.bmp", green)
    cv2.imwrite("try/green_w-contours.bmp", green_W)

test_green_pattern()

import cv2
import numpy as np

def check_display(image_path, grid_size=(160, 320)):
    """
    检查显示屏是否存在坏像素。

    Args:
        image_path (str): 显示屏图像的路径。
        grid_size (tuple): 显示屏的网格尺寸 (列数,行数)。

    Returns:
        tuple: 包含以下内容的元组:
            - bad_pixels (list): 坏像素坐标的列表,格式为 [(x1, y1), (x2, y2), ...]。
            - image_with_marks (ndarray): 标记了坏像素的图像。
    """

    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (3, 3), 0)  # 使用小内核的高斯模糊来减少噪点
    thresh = cv2.threshold(blurred, 120, 255, cv2.THRESH_BINARY)[1]

    # 根据网格尺寸计算每个单元格的宽度和高度
    cell_width = image.shape[1] // grid_size[0]
    cell_height = image.shape[0] // grid_size[1]

    bad_pixels = []
    for row in range(grid_size[1]):
        for col in range(grid_size[0]):
            # 提取单元格 ROI
            x1 = col * cell_width
            y1 = row * cell_height
            x2 = x1 + cell_width
            y2 = y1 + cell_height
            cell = thresh[y1:y2, x1:x2]

            # 检查单元格是否全黑或全白
            if np.sum(cell) == 0 or np.sum(cell) == 255 * cell.shape[0] * cell.shape[1]:
                bad_pixels.append((col, row))
                # 在图像上标记坏像素(可选)
                cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 1)

    return bad_pixels, image

# 使用示例
image_path = 'path_to_your_image.jpg'  # 将其替换为的图像路径
bad_pixels, marked_image = check_display(image_path)

if bad_pixels:
    print(f"发现 {len(bad_pixels)} 个坏像素:")
    for pixel in bad_pixels:
        print(f"  - 列: {pixel[0]}, 行: {pixel[1]}")
    cv2.imshow("坏像素", marked_image)
    cv2.waitKey(0)
else:
    print("未发现坏像素。")

说明:

  1. 网格检测: 该代码首先根据提供的 grid_size 计算网格。然后,它会遍历每个单元格(网格交点之间的区域)并分析其内容。
  2. 阈值化: 对图像进行阈值化以创建二值图像,其中亮像素表示可能的像素,而暗像素表示背景或坏像素。
  3. 单元格分析: 对于每个单元格,代码都会检查它是否主要包含黑色或白色像素。如果满足此条件,则该单元格将被标记为可能包含坏像素。
  4. 坏像素标记: 然后,该代码将在原始图像上标记检测到的坏像素,以便于可视化。

使用方法:

  1. 替换 image_path 为的图像文件路径。
  2. 调整 grid_size 以匹配的显示分辨率。
  3. 运行代码。

该代码将在的显示器图像上显示标记的坏像素,并在控制台中打印出它们的坐标。

注意:

  • 此代码假定提供的图像是均匀照明的显示屏图像。
  • 阈值和模糊参数可能需要根据的特定图像进行调整以获得最佳结果。

标签:python,python-3.x,opencv,machine-learning,computer-vision
From: 75924341

相关文章

  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......
  • Python CDLL 无法加载两次
    我正在尝试用python创建一个密码管理器,但遇到了一个问题,一旦加载了一种类型的dll,我就无法加载不同的dll,在这个示例中,我加载了一个dll,并尝试解密加密的密码数据,它工作正常,直到我加载另一个不同的nss3.dll文件,此时它给我一个错误:“过程入口点HeapAlloc无法位于动态链......
  • 你能将 HTTPS 功能添加到 python Flask Web 服务器吗?
    我正在尝试构建一个Web界面来模拟网络设备上的静态接口,该网络设备使用摘要式身份验证和HTTPS。我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以向我展示如何实现,请评论我需要使用下面的代码做什么来实现这一点。from......
  • Python:比较 csv 文件并打印相似之处
    我需要比较两个csv文件并打印出它们的相似之处。第一个文件有名称和浓度,第二个文件就像只有名称的“最佳”列表,我需要绘制相似性图表。例如,这就是我的列表的样子:file1-old_file.csvname_id,conc_test1,conc_test2name1,####,####name2,###......
  • Python 类交叉引用
    我用Python创建了一个数独游戏。我有一个:单元格类-“保存”数字可能性单元格组-保存单元格类实例我使用这些组在数独中运行行、列和正方形功能。每个单元格包含所有组,他属于classCell:def__init__(groups):self.groups=groupscla......
  • 如何修复我的 Python Azure Function DevOps Pipeline 上的“找到 1 个函数(自定义)加载
    我正在尝试使用AzureDevOps构建管道将PythonAzureFunction部署到Azure门户。由于某种原因,代码被部署到服务器,但我在尝试访问端点时收到404错误。我收到一个错误,显示1functionsfound(Custom)0functionsloaded,以及在服务器上显示ModuleNotFound......
  • 使用 kivy 从 python 脚本的 buildozer 构建 android apk 时出错
    我想从使用kivy包构建的Python脚本构建apk为此,我使用googlecollab.这里是main.py脚本:importyoutube_dlfromkivy.appimportAppfromkivy.uix.boxlayoutimportBoxLayoutfromkivy.uix.buttonimportButtonfromkivy.uix.tex......
  • 自动解码并检索 S/MIME 加密电子邮件的正文 (python)
    我如何:用python代码连接我的邮件收件箱以自动获取未读电子邮件的加密内容;解码S/MIME加密电子邮件(我有密钥);检索电子邮件正文纯文本;检查正文(或主题)是否与某个关键字(现在为“test”)匹配,并在匹配时打印一些内容;在树莓派上使用此代码,无需手动......
  • Python 3 写入 DBF(带有 Memo 的 dBase IV)
    我需要在Python3中写入带有备注字段的dBaseIVdbf文件,但找不到合适的模块来执行此操作。我尝试过的包:Simpledbf-只读dbf-不支持dBaseIVdbfpy-不支持Python3dbfpy3-不支持dBaseIVYDbf-不支持备注字段pyshp-无法仅使用dbf文件......