সোবেল এজ ডিটেক্টর


12

আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হয় যা কোনও ইনপুট চিত্র নেয় এবং একটি আউটপুট চিত্র হয়ে উঠতে প্রান্ত সনাক্তকরণের মাধ্যমে চালায়।

প্রান্ত-সনাক্তকরণ নীচের হিসাবে কাজ করে (যদি অস্পষ্ট থাকে তবে স্বচ্ছ প্রান্ত সনাক্তকরণ দেখুন ):

  • পিক্সেলের মান হ'ল পিক্সেলের মোট উজ্জ্বলতা, তাই যদি এটি রঙ হয় তবে আপনাকে প্রথমে গ্রেস্কেলতে রূপান্তর করতে হবে (জিনিসগুলি সহজ এবং গল্ফ-সক্ষম রাখতে, আপনি আর, জি এবং গড় মূল্য নিতে পারেন বি)।
  • পিক্সেল পি (i, j) এর জন্য জি এক্স এবং জি ওয়াইয়ের সূত্রগুলি হ'ল :
    • জি x = -1 * পি (আই -1 , জে -1) - 2 * পি (আই -1, জে) - 1 * পি (আই -1, জে + 1) + 1 * পি (আই + 1, জে) -1) + 2 * পি (আমি + 1, জে) + 1 * পি (আই + 1, জে + 1)
    • জি y = -1 * পি (আই -1 , জে -1) - 2 * পি (আই, জে -1) - 1 * পি (আই + 1, জে -1) + 1 * পি (আই -1, জে) +1) + 2 * পি (আমি, জে + 1) + 1 * পি (আই + 1, জে + 1)
  • সেই পিক্সেলের প্রান্তের আকারের মানটি তখন: √ (G x 2 + G y 2 )

আউটপুট চিত্রটি প্রতিটি পিক্সেলের জন্য প্রান্তের আকার G (G x 2 + G y 2 ) হিসাবে গ্রেস্কেল হিসাবে থাকে।

বোনাসেস:

  • প্রান্ত সনাক্তকরণের আগে কোনও ছোট প্রান্ত বাদ দিতে ছবিটি মসৃণ করতে গাউসিয়ান অস্পষ্টতা সম্পাদন করুন। এটি শেষ ফলাফলের উপর -30% এর বোনাস দেয়।
  • অ্যাকাউন্টে প্রান্তের কোণটি নিন। সূত্র আর্টিকান (জি ওয়াই / জি এক্স ) থেকে প্রাপ্ত কোণটি ব্যবহার করে একই গ্রেস্কেল মানটি নিয়ে এবং রঙিন চাকা থেকে রঙ যুক্ত করে আপনি আউটপুট পিক্সেলটিকে কিছু রঙ দেন । এটি শেষ ফলাফলের উপর -30% এর আরও একটি বোনাস দেয়।

নিয়মাবলী:

  • আপনি এজপিক্সেলগুলির মানটি বাদ দিতে পারেন এবং সেগুলি কালোতে সেট করতে পারেন বা আপনি চিত্রের বাইরের কোনও পিক্সেলের জন্য 0 ব্যবহার করতে পারেন।
  • আপনার আউটপুট চিত্রটি অবশ্যই একটি ইমেজ ফর্ম্যাটে থাকতে হবে যা বেশিরভাগ কম্পিউটারে খোলা যেতে পারে।
  • আউটপুট অবশ্যই ডিস্কে লিখিত হতে হবে বা কোনও ফাইলের জন্য পাইপযোগ্য।
  • ইনপুটটি কমান্ডলাইন আর্গুমেন্ট হিসাবে দেওয়া হয়, চিত্রটির তুলনামূলক পথের আকারে, বা কমান্ডলাইন থেকে পাইপ করা হয়।
  • এটি কোড গল্ফ, তাই বাইটস মধ্যে সংক্ষিপ্ততম কোড!

আপনি ঠিক গাউসের অস্পষ্টতা নির্দিষ্ট করতে পারেন? ইনপুটটিও কি গ্রেস্কেল হিসাবে রয়েছে, যদি না হয় তবে রঙিন চিত্রগুলিতে আমাদের এই প্রান্ত সনাক্তকরণটি কীভাবে প্রয়োগ করা উচিত? এটি কি ঠিক যে আউটপুট চিত্রটির ইনপুটটির মতো ঠিক একই আকার থাকে তবে ইনপুটটি কেবলমাত্র অভ্যন্তরীণ পিক্সেলগুলিতে সঞ্চালিত হয় (আমরা শূন্যে সেট করেছি এমনটি নয়)?
flawr

আপনি কি কম্পিউটারফিল থেকে প্রান্ত সনাক্তকরণ সম্পর্কিত ভিডিওগুলি দেখেছেন ? আমি সেখানে একটি সংযোগ গন্ধ করতে পারি :)
জায়ান্ট্রি ট্রি

@ ফ্লোয়ার আমাকে গাউসিয়ান ব্লার কি প্রান্ত সনাক্তকরণের জন্য ভাল তা পরীক্ষা করতে হবে, তাই আমি ভাল মূল্য কী তা জানি না। গাউসি অস্পষ্টতা সম্পর্কে আরও এখানে । ইনপুট চিত্রটি রঙিন এবং আপনি প্রান্ত সনাক্তকরণ সম্পাদন করতে চাইলে আপনাকে প্রথমে গ্রেস্কেলতে রূপান্তর করতে হবে। প্রান্ত সনাক্তকারী হয় A হয়: অভ্যন্তরীণ পিক্সেলগুলিতে এবং আপনি আউটপুট চিত্রের বাহ্যিক 1px সীমানাটি কালো বা B: সমস্ত পিক্সেলে সেট করেন এবং আপনি ইমেজের বাইরে যে কোনও পিক্সেলের মান হিসাবে 0 নেন।
ভ্রুইম

@ জায়ান্ট্রি ট্রি নুওও ভিডিওটি সম্পূর্ণরূপে সম্পর্কিত নয় :)
vrwim

4
কেন এটিকে ভোট দেওয়া হয়েছে? এটি একটি নিখুঁত বৈধ প্রশ্ন বলে মনে হচ্ছে।
অ্যাডিসন ক্রম্প

উত্তর:


13

জে, 166 164 161 154 150 144 143 বাইট।

খুব বেশি গল্ফ হয়নি; আমি বেশিরভাগ ক্ষেত্রে আমার দীর্ঘায়িত প্রয়োগটি ভেঙ্গে ফেলেছি (নীচে দেখুন), সুতরাং সম্ভবত উন্নতির জন্য প্রচুর জায়গা রয়েছে। বিএমপি লাইব্রেরি ব্যবহার করে। ফাইলে ফলাফল সংরক্ষণ করে o। আমি কেবলমাত্র পূর্ণ 3x3 কোষ ব্যবহার করে এজপিক্সেল পরিচালনা করেছি, সুতরাং চূড়ান্ত চিত্রটির প্রস্থ এবং উচ্চতা 2 পিক্সেল ছোট।

load'bmp'
S=:s,.0,.-s=:1 2 1
p=:([:*:[:+/[:,*)"2
'o'writebmp~256#.3#"0<.255<.%:(S&p+(|:S)&p)3 3,.;._3(3%~])+/"1(3#256)#:readbmp}:stdin''
exit''

ব্যবহার:

echo 'image.bmp' | jconsole golf.ijs

সম্প্রসারিত:

load 'bmp'

sobel1 =: 3 3 $ 1 0 _1 2 0 _2 1 0 _1
NB. transposed
sobel2 =: |: sobel1
NB. read image
image =: readbmp }: stdin''
NB. convert default representation to R,G,B arrays
rgbimage =: (3 # 256) #: image
NB. convert to grayscale
greyimage =: 3 %~ (+/"1) rgbimage
NB. 3x3 cells around each pixel
cells =: 3 3 ,.;._3 greyimage
NB. multiply 3x3 cell by 3x3 sobel, then sum all values in it
partial =: 4 : '+/"1 +/"1 x *"2 y'
NB. square partial (vertical and horizontal) results, sum and root
combine =: [: %: *:@[ + *:@]
NB. limit RGB values to 255
limit =: 255 <. ]
newimage =: limit (sobel1&partial combine sobel2&partial) cells
NB. convert back to J-friendly representation
to_save =: 256 #. 3 #"0 <. newimage
to_save writebmp 'out.bmp'
NB. jconsole stays open by default
exit''

নমুনা ইনপুট এবং আউটপুট:

মূল প্রান্ত সনাক্তকরণ


এটি ;._3সাবহারে অপারেটরের একটি দুর্দান্ত উদাহরণ । আমি লক্ষ্য করেছি যে আপনি pসাববারে তৈরি করার পরে তাদের পদক্ষেপের জন্য র‌্যাঙ্ক 2 সহ একটি ক্রিয়া সংজ্ঞায়িত করেছেন। আপনি কাটা যখন আপনি পরিবর্তে প্রতিটি subarray অপারেট করতে পারে। আপনার কাজের উপর ভিত্তি করে এটি বাস্তবায়নের আমার চেষ্টাটি 256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:। এটি এটিকে মোট 126 বাইটে নামিয়ে নেওয়া উচিত।
মাইল

আমি এটিকে 'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''ধরে নিলাম 119 বাইটে নেমেছি যে কেবল ফাইলের নাম স্টিডিনে ইনপুট রয়েছে। আপনি এটি ব্যবহার করে এটি সম্পাদন করতে পারেন echo -nযাতে কোনও অতিরিক্ত নিউলাইন স্টিডিনে অন্তর্ভুক্ত না হয়। আমার কম্পিউটারে স্ক্রিপ্টটিতে পাইপযুক্ত ইনপুট ব্যবহার করার সময় স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে প্রস্থান হয় যার অর্থ আমাকে অন্তর্ভুক্ত করতে হবে না exit''এবং অতিরিক্ত 6 বাইট সংরক্ষণ করতে পারি তবে আমি নিশ্চিত নই যে এটি সবার জন্য সত্য কিনা।
মাইল

1

পাইথন, 161 * 0.7 = 112.7 বাইট

গাউসিয়ান ব্লার বোনাস সহ।

যেহেতু আপনি স্পষ্টভাবে অন্তর্নির্মিত পদ্ধতিগুলি নিষিদ্ধ করেন নি, এখানে ওপেনসিভি রয়েছে:

from cv2 import*
from numpy import*
g=GaussianBlur(cvtColor(imread(raw_input()),6),(3,3),sigmaX=1)
x,y=Sobel(g,5,1,0),Sobel(g,5,0,1)
imwrite('s.png',sqrt(x*x+y*y))

বোনাস ছাড়াই, 136 বাইট

from cv2 import*
from numpy import*
g=cvtColor(imread(raw_input()),6)
x,y=Sobel(g,5,1,0),Sobel(g,5,0,1)
imwrite('s.png',sqrt(x*x+y*y))
  • সম্পাদনা 1: নামযুক্ত কনস্ট্যান্সকে তাদের মান দ্বারা প্রতিস্থাপন করেছে।
  • সম্পাদনা 2: নমুনা আপলোড করা হয়েছে

মূল ফিল্টার


আপনি সম্ভবত একটি নমুনা ইনপুট এবং আউটপুট চিত্র দিতে পারেন?
আর কাপ,

@ আর কেপ আগের চেয়ে আরও বেশি দেরী করেছেন।
কার্ল ন্যাপফ

0

ম্যাটল্যাব, 212 * 0.4 = 84.8 বাইট

ফিল্টার টুলবক্স এবং এইচএসভি রঙের স্থান ব্যবহার করে

function f(x);f=@(i,x)imfilter(i,x);s=@(x)fspecial(x);S=s('sobel');A=f(double(rgb2gray(imread(x)))/255,s('gaussian'));X=f(A,S);Y=f(A,S');imwrite(hsv2rgb(cat(3,atan2(Y,X)/pi/2+0.5,0*A+1,sqrt(X.^2+Y.^2))),'t.png')

বা ungolfed

function f(x)
f=@(i,x)imfilter(i,x);
s=@(x)fspecial(x);
S=s('sobel');
A=f(double(rgb2gray(imread(x)))/255,s('gaussian'));
X=f(A,S);
Y=f(A,S');
imwrite(hsv2rgb(cat(3,atan2(Y,X)/pi/2+0.5,0*A+1,sqrt(X.^2+Y.^2))),'t.png')

0

লাভ 2 ডি লুয়া, 466 বাইট

A=arg[2]i=love.image.newImageData q=math t=i(A)g=i(t:getWidth()-2,t:getHeight()-2)m={{-1,-2,-1},{0,0,0},{1,2,1}}M={{-1,0,1},{-2,0,2},{-1,0,1}}t:mapPixel(function(_,_,r,g,b)a=(r+g+b)/3 return a,a,a end)g:mapPixel(function(x,y)v=0 for Y=0,2 do for X=0,2 do v=v+(t:getPixel(x+X,y+Y)*m[Y+1][X+1])end end V=0 for Y=0,2 do for X=0,2 do V=V+(t:getPixel(x+X,y+Y)*M[Y+1][X+1])end end v=q.max(q.min(q.sqrt(V^2+v^2),255),0)return v,v,v end)g:encode('png',"o")love.event.quit()

কমান্ড লাইন ইনপুট নেয়, আপনার লাভ 2 ডি অ্যাপসডাটা ফোল্ডারের অধীনে "ও" নামক কোনও ফাইলের আউটপুট দেয়। লাভ 2 ডি আপনাকে অন্য কোথাও ফাইল সংরক্ষণ করতে দেয় না।

আমি যতটা গল্ফড পেয়েছিলাম তা সম্ভবত আরও গল্ফ করা যেতে পারে।

ব্যাখ্যা

-- Assign the Input to A
A=arg[2]


-- Assign some macros to save FUTURE BYTES™
i=love.image.newImageData
q=math

-- t is the original image, g is the new output image. g is two pixels smaller, which is easier and better looking than a border.
t = i(A)
g = i(t:getWidth()-2,t:getHeight()-2)

-- m and M are our two sobel kernals. Fairly self explanitary.
m = {{-1,-2,-1}
    ,{0,0,0}
    ,{1,2,1}}

M = {{-1,0,1}
    ,{-2,0,2}
    ,{-1,0,1}}

-- Convert t to grayscale, to save doing this math later.
t:mapPixel(function(_,_,r,g,b)a=(r+g+b)/3 return a,a,a end)

-- Execute our kernals
g:mapPixel(function(x,y)
    -- v refers to the VERTICAL output of the Kernel m.
    v=0
    for Y=0,2 do
        for X=0,2 do
            v=v+(t:getPixel(x+X,y+Y)*m[Y+1][X+1])
        end
    end

    -- V is the HORIZONTAL of M
    V=0
    for Y=0,2 do
        for X=0,2 do
            V=V+(t:getPixel(x+X,y+Y)*M[Y+1][X+1])
        end
    end

    -- Clamp the values and sum them.
    v = q.max(q.min(q.sqrt(V^2 + v^2),255),0)
    -- Return the grayscale.
    return v,v,v
end)

-- Save, renaming the file. The golfed version just outputs as 'o'
g:encode('png',"S_".. A:gsub("(.*)%....","%1.png"))

-- Quit. Not needed, but I'm a sucker for self contained LOVE2D
love.event.quit()

পরীক্ষা

ইনপুট আউটপুট

এবং...

যদিও এটি আসলে আমার স্কোরকে উন্নতি করে না (এটিকে আরও খারাপ করে তোলে), এখানে রঙিন চাকা প্রয়োগ করা সংস্করণ।

900 - 270 = 630 বাইট

A=arg[2]i=love.image.newImageData q=math t=i(A)g=i(t:getWidth()-2,t:getHeight()-2)m={{-1,-2,-1},{0,0,0},{1,2,1}}M={{-1,0,1},{-2,0,2},{-1,0,1}}function T(h,s,v)if s <=0 then return v,v,v end h,s,v=h*6,s,v/255 local c=v*s local x=(1-q.abs((h%2)-1))*c local m,r,g,b=(v-c),0,0,0 if h < 1 then r,g,b=c,x,0 elseif h < 2 then r,g,b=x,c,0 elseif h < 3 then r,g,b=0,c,x elseif h < 4 then r,g,b=0,x,c elseif h < 5 then r,g,b=x,0,c else r,g,b=c,0,x end return(r+m)*255,(g+m)*255,(b+m)*255 end t:mapPixel(function(_,_,r,g,b)a=(r+g+b)/3 return a,a,a end)g:mapPixel(function(x,y)v=0 for Y=0,2 do for X=0,2 do v=v+(t:getPixel(x+X,y+Y)*m[Y+1][X+1])end end V=0 for Y=0,2 do for X=0,2 do V=V+(t:getPixel(x+X,y+Y)*M[Y+1][X+1])end end h=v H=V v=q.max(q.min(q.sqrt(V^2+v^2),255),0)h=q.atan2(H,h)/q.pi*2 return T(h,1,v,255)end)g:encode('png',"S_".. A:gsub("(.*)%....","%1.png"))G=love.graphics.newImage(g)love.event.quit()

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.