How can I add custom icon for my operators in a specific addon?
Well I found the solution from this attached file here, and here is a code example...
import os

import bpy
import bpy.utils.previews
from bpy.types import Panel


preview_collections = {}
# If you work with a simple script.
dir = os.path.dirname(bpy.data.filepath)
# If you work with an addon.
# dir = os.path.join(os.path.dirname(__file__), &quot;icons&quot;)

pcoll = bpy.utils.previews.new()

for entry in os.scandir(dir):
    if entry.name.endswith(&quot;.png&quot;):
        name = os.path.splitext(entry.name)[0]
        pcoll.load(name.upper(), entry.path, &quot;IMAGE&quot;)


class VIEW3D_PT_test(Panel):
    bl_label = &quot;TEST&quot;
    bl_category = &quot;TEST&quot;
    bl_space_type = &quot;VIEW_3D&quot;
    bl_region_type = &quot;UI&quot;

    def draw(self, context):
        layout = self.layout
        scene = context.scene

        layout.prop(scene, &quot;use_gravity&quot;, text=&quot;Enable Layout&quot;)

        col = layout.column()
        col.enabled = scene.use_gravity
        col.operator(&quot;object.duplicate_move&quot;, text=&quot;Custom Icon&quot;, icon_value=pcoll[&quot;ICON&quot;].icon_id)
        col.operator(&quot;object.duplicate_move&quot;, text=&quot;Built-in Icon&quot;, icon=&quot;OUTPUT&quot;)


bpy.utils.register_class(VIEW3D_PT_test)

Just note, that If you work on an addon, the dir should be like this dir = os.path.join(os.path.dirname(__file__), &quot;icons&quot;) and icons should be saved in .png format into folder icons into the same place where your .py file is.
And if you work on a simple script, dir should be like this dir = os.path.dirname(bpy.data.filepath) and icons should be into the same place where your .py and .blend file is.